#python #pandas #dataframe
#python #панды #фрейм данных
Вопрос:
У меня много фреймов данных, и мне нужно объединить / объединить их все. DF1 является основным / основным фреймом данных, а затем есть много меньших фреймов данных, содержащих key1 и key2. Для данной пары key1 и key2 будет только 1 строка во всех фреймах данных, отличных от основного. Прямо сейчас я перебираю все фреймы данных и объединяю их один за другим в master / result, поэтому я получаю много columns_x и columns_y
Я делаю что-то вроде этого
result = pd.merge(df1, df2, how='outer',on=['key1', 'key2'])
result = pd.merge(result, df3, how='outer',on=['key1', 'key2'])
result = pd.merge(result, df4, how='outer',on=['key1', 'key2'])
Прилагается изображение фреймов данных и результат, который я хочу видеть.
Ответ №1:
Вы можете объединить совместимые фреймы данных по вертикали (df2, df3 и df4), а затем объединить их по горизонтали с df1 следующим образом :
df1 = pd.DataFrame({'key1': [1, 1, 1, 1, 1, 1], 'key2': [1, 2, 3, 4, 5, 6], 'A': ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'],
'B': ['B1', 'B2', 'B3', 'B4', 'B5', 'B6'], 'C': ['C1', 'C2', 'C3', 'C4', 'C5', 'C6']})
df2 = pd.DataFrame({'key1': [1, 1], 'key2': [3, 4], 'D': ['D1', 'D2'], 'E': ['E1', 'E2'], 'F': ['F1', 'F2']})
df3 = pd.DataFrame({'key1': [1, 1], 'key2': [1, 5], 'G': ['G1', 'G2'], 'H': ['H1', 'H2']})
df4 = pd.DataFrame({'key1': [1, 1], 'key2': [2, 6], 'I': ['I1', 'I2'], 'J': ['J1', 'J2'], 'D': ['D1_DF4', 'D2_DF4'],
'G': ['G1_DF4', 'G2_DF4']})
df_concat = pd.concat([df2, df3, df4], sort=False, ignore_index = True)
df_merge = pd.merge(df1, df_concat, on=['key1', 'key2'], how = 'outer')
df_merge
Выходной сигнал :
key1 key2 A B C D E F G H I J
0 1 1 A1 B1 C1 NaN NaN NaN G1 H1 NaN NaN
1 1 2 A2 B2 C2 D1_DF4 NaN NaN G1_DF4 NaN I1 J1
2 1 3 A3 B3 C3 D1 E1 F1 NaN NaN NaN NaN
3 1 4 A4 B4 C4 D2 E2 F2 NaN NaN NaN NaN
4 1 5 A5 B5 C5 NaN NaN NaN G2 H2 NaN NaN
5 1 6 A6 B6 C6 D2_DF4 NaN NaN G2_DF4 NaN I2 J2
Комментарии:
1. Он отлично работает, когда у меня меньший набор данных, но мне не хватает памяти для большего набора данных. Я говорю о 100000 строках с примерно 90 столбцами. Я пытался использовать циклы и удалять промежуточные фреймы данных, а также переустанавливать python64. Но у меня все еще есть проблема с памятью. У кого-нибудь есть какое-либо решение по решению проблемы памяти. Использование Windows.
Ответ №2:
Почему бы не переименовать столбцы перед объединением? В том, что вы делаете, нет ничего плохого, кроме именования столбцов. Если у вас есть столбцы с одинаковыми именами:
import pandas as pd
af = pd.DataFrame(data=[[1,1,'A1','B1','C1'],
[1,2,'A2','B2','C2'],
[1,1,'A3','B3','C3']],
columns=['key1', 'key2', 'A', 'B', 'C'])
af = af.set_index(['key1', 'key2'])
bf = pd.DataFrame(data=[[1,3,'D3','E3','F3'],
[1,4,'D4','E4','F4']],
columns=['key1', 'key2', 'D', 'E', 'F'])
bf = bf.set_index(['key1', 'key2'])
result = pd.merge(af, bf, how='outer',on=['key1', 'key2'])
дает:
A B C D E F
key1 key2
1 1 A1 B1 C1 NaN NaN NaN
1 A3 B3 C3 NaN NaN NaN
2 A2 B2 C2 NaN NaN NaN
3 NaN NaN NaN D3 E3 F3
4 NaN NaN NaN D4 E4 F4
Если имена столбцов равны:
bf.columns=['A', 'B', 'C']
result = pd.merge(af, bf, how='outer',on=['key1', 'key2'])
вы получаете:
A_x B_x C_x A_y B_y C_y
key1 key2
1 1 A1 B1 C1 NaN NaN NaN
1 A3 B3 C3 NaN NaN NaN
2 A2 B2 C2 NaN NaN NaN
3 NaN NaN NaN D3 E3 F3
4 NaN NaN NaN D4 E4 F4