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

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

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) может измениться. Кроме того, в качестве ориентира, поскольку это часть более крупного процесса, столбцы в кадрах данных всегда будут идентичны строкам (и позициям) в списке, как в этом примере.

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

Ваш целевой вывод имеет идентичные имена столбцов, pandas просто сохраняет последний из перечисленных. Хотите сохранить все три?

Michael Cao 22.08.2024 18:43

Да, спасибо, надо было это подчеркнуть. Целевой вывод будет иметь три имени столбца, все три из которых идентичны и их необходимо сохранить.

bigjdawg43 22.08.2024 18:45
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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)

Спасибо, что заглянули. На самом деле это выглядит точно так же, как то, что я ищу, но возникают проблемы с применением к моему более крупному набору данных, потому что в моем наборе данных столбец даты на самом деле является индексом (забыл указать это в примере). Как я могу настроить код для работы, учитывая, что моя дата является индексом? Кроме того, как я могу распаковать «out», чтобы каждый df был отдельным?

bigjdawg43 22.08.2024 19:05

@ bigjdawg43 bigjdawg43 Я обновил ответ, учитывая ваш комментарий.

e-motta 22.08.2024 19:14

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

bigjdawg43 22.08.2024 19:23

@bigjdawg43 Конечно, просто сделай for sec in securities3: ... df = ...

e-motta 22.08.2024 19:32

Большое вам спасибо за помощь. Очень ценю

bigjdawg43 22.08.2024 19:37

Другие вопросы по теме