У меня есть три кадра данных временных рядов
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) может измениться. Кроме того, в качестве ориентира, поскольку это часть более крупного процесса, столбцы в кадрах данных всегда будут идентичны строкам (и позициям) в списке, как в этом примере.
Спасибо за помощь.
Да, спасибо, надо было это подчеркнуть. Целевой вывод будет иметь три имени столбца, все три из которых идентичны и их необходимо сохранить.
Предполагая, что все фреймы данных имеют одинаковые даты в одном и том же порядке, вы можете объединить даты + столбцы со значениями 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)
Спасибо, что заглянули. На самом деле это выглядит точно так же, как то, что я ищу, но возникают проблемы с применением к моему более крупному набору данных, потому что в моем наборе данных столбец даты на самом деле является индексом (забыл указать это в примере). Как я могу настроить код для работы, учитывая, что моя дата является индексом? Кроме того, как я могу распаковать «out», чтобы каждый df был отдельным?
@ bigjdawg43 bigjdawg43 Я обновил ответ, учитывая ваш комментарий.
Удивительно, спасибо вам огромное. Последний вопрос... учитывая, что я пытаюсь сделать это динамичным, поскольку элементы ценных бумаг3 могут измениться, есть ли способ итеративно включить создание фреймов данных (SPX и BIL) в цикл?
@bigjdawg43 Конечно, просто сделай for sec in securities3: ... df = ...
Большое вам спасибо за помощь. Очень ценю
Ваш целевой вывод имеет идентичные имена столбцов, pandas просто сохраняет последний из перечисленных. Хотите сохранить все три?