Объединение фреймов данных в Pandas с использованием итерации, но это не работает

#python-3.x #pandas #dataframe

#python-3.x #pandas #фрейм данных

Вопрос:

У меня есть несколько фреймов данных, более или менее проиндексированных одним и тем же мультииндексом (в каждом фрейме данных может отсутствовать несколько значений, но общее количество строк превышает 70 КБ, а недостающие значения всегда меньше 10). Я хочу присоединить / объединить / объединить ко всем из них данный фрейм данных (с одинаковой индексацией). Я попытался сделать это, используя итерацию for с кортежем, как в приведенном здесь примере. Однако в конце все мои фреймы данных не объединяются. Я привожу простой пример, где это происходит. Почему они не сливаются?

 df1 = pd.DataFrame(np.arange(12).reshape(4,3), index = ["A", "B", "C", "D"], columns = ["1st", "2nd", "3rd"])
df2 = df1   2
df3 = df1 - 2
for df in (df1, df2):
    df = pd.merge(df, df3, left_index = True, right_index = True, how = "inner")
df1, df2
  

Ответ №1:

Каков ваш ожидаемый результат?

В for цикле df находится переменная цикла, а также результат в левой части инструкции присваивания. Вот тот же цикл с инструкциями печати для предоставления дополнительной информации. Я думаю, что вы переписываете промежуточные результаты.

 for df in (df1, df2):
    print(df)
    print('-----')
    df = pd.merge(df, df3, left_index = True, right_index = True, how = "inner")
    print(df)
    print('==========', end='nn')
print(df)
  

Вы могли бы объединить df1, df2 и df3 следующим образом.

 print(pd.concat([df1, df2, df3], axis=1))

   1st  2nd  3rd  1st  2nd  3rd  1st  2nd  3rd
A    0    1    2    2    3    4   -2   -1    0
B    3    4    5    5    6    7    1    2    3
C    6    7    8    8    9   10    4    5    6
D    9   10   11   11   12   13    7    8    9
  

Обновить

Вот идиоматический способ импортировать и объединить несколько файлов CSV, возможно, в нескольких каталогах. Короче говоря: считайте каждый файл в отдельный фрейм данных; добавьте каждый фрейм данных в список; объедините один раз в конце.

Ссылка: https://pandas.pydata.org/docs/user_guide/cookbook.html#reading-multiple-files-to-create-a-single-dataframe

 import pandas as pd
from pathlib import Path

df = list()

for filename in Path.cwd().rglob('*.csv'):
    with open(filename, 'rt') as handle:
        t = pd.read_csv(handle)
        df.append(t)
        print(filename.name, t.shape)
df = pd.concat(df)
print('nfinal: ', df.shape)

penny.csv (62, 8)
penny-2020-06-24.csv (144, 9)
...etc

final:  (474, 20)
  

Комментарии:

1. У меня есть десятки фреймов данных (скажем, df1, …., dfn), и я хочу добавить к каждому из них один фрейм данных (скажем, dfUnique). Я не хочу выполнять копирование-вставку кода, но цикл for или другую подобную итерацию, чтобы сделать это за меня. Код, который я пишу, если вы запустите его, после его запуска df1 и df2 останутся прежними (df3 не был объединен).

2. Опубликованная вами ссылка дала решение, которое я хотел.