Перебор столбцов в нескольких кадрах данных и условное выполнение операции

У меня есть три кадра данных временных рядов

df_list=[px, SC, SMA]

Каждый фрейм данных имеет одинаковые столбцы и одинаковые даты. У меня также есть список ценных бумаг (сокращенный для примера):

securities3=['SPX Index','BIL US Equity']

Я пытаюсь сделать что-то вроде приведенного ниже, но у него нет правильного синтаксиса:

for df in df_list:
    for col in df.columns:       
        if col==securities3:
            ***create new dataframe here***

Другими словами, я хочу перебрать каждый фрейм данных в df_list, в каждом столбце df, когда столбец соответствует компонентам ценных бумаг3, я хочу, чтобы новый фрейм данных был сформирован с этими тремя столбцами (один столбец из каждого фрейма данных, соответствующий списку ценных бумаг3 .

Чтобы предоставить более подробную информацию, пожалуйста, смотрите ниже примеры данных:

import pandas as pd

px_data = {'Date': ['8/11/18', '8/12/18', '8/13/18', '8/14/18'],
        'SPX Index': [58.63, 21.25, 19.17, 18.8],
        'BIL US Equity': [35,105,27,98]}

SC_data = {'Date': ['8/11/18', '8/12/18', '8/13/18', '8/14/18'],
        'SPX Index': [20.50, 6, 82, 74.6],
        'BIL US Equity': [74,62,8,99]}

SMA_data = {'Date': ['8/11/18', '8/12/18', '8/13/18', '8/14/18'],
        'SPX Index': [2, 95.3, 39, 68.27],
        'BIL US Equity': [58,37,74,11]}

px = pd.DataFrame(px_data)
SC = pd.DataFrame(SC_data)
SMA = pd.DataFrame(SMA_data)

Целевой результат:

SPX_data = {'Date': ['8/11/18', '8/12/18', '8/13/18', '8/14/18'],
     'SPX Index': [58.63, 21.25, 19.17, 18.8],
     'SPX Index': [20.50, 6, 82, 74.6],
     'SPX Index': [2, 95.3, 39, 68.27]}
    
SPX = pd.DataFrame(SPX_data)

Я пытаюсь создать фрейм данных SPX (например) в цикле, потому что список (ценные бумаги3) может измениться. Кроме того, в качестве ориентира, поскольку это часть более крупного процесса, столбцы в кадрах данных всегда будут идентичны строкам (и позициям) в списке, как в этом примере.

Спасибо за помощь.

🤔 А знаете ли вы, что...
В Python есть инструменты для тестирования кода, такие как библиотека unittest.


1
50
1

Ответ:

Решено

Предполагая, что все фреймы данных имеют одинаковые даты в одном и том же порядке, вы можете объединить даты + столбцы со значениями axis=1:

date = df_list[0]["Date"]
out = [pd.concat([date] + [df[sec] for df in df_list], axis=1) for sec in securities3]

for df in out:
    print(df)
      Date  SPX Index  SPX Index  SPX Index
0  8/11/18      58.63       20.5       2.00
1  8/12/18      21.25        6.0      95.30
2  8/13/18      19.17       82.0      39.00
3  8/14/18      18.80       74.6      68.27
      Date  BIL US Equity  BIL US Equity  BIL US Equity
0  8/11/18             35             74             58
1  8/12/18            105             62             37
2  8/13/18             27              8             74
3  8/14/18             98             99             11

Обновлять:

Если 'Date' — это индекс, удалите дату из вызова concat.

Если вы хотите, чтобы каждый фрейм данных был в переменной, удалите внешний цикл в понимании списка.

for sec in securities3:
    df = pd.concat([df[sec] for df in df_list], axis=1)