#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, возможно, в нескольких каталогах. Короче говоря: считайте каждый файл в отдельный фрейм данных; добавьте каждый фрейм данных в список; объедините один раз в конце.
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. Опубликованная вами ссылка дала решение, которое я хотел.