我有很多数据框,我需要合并/连接所有它们。 DF1是主要/主要数据帧,然后有许多包含key1和key2的较小数据帧。 除了主数据外,在所有数据帧中,给定的key1和key2对只有1行。 现在,我遍历所有数据帧并将它们逐一合并到主数据/结果中,所以我得到了很多column_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'])
随附的是数据框的图片以及我想看到的结果。
答案 0 :(得分:0)
您可以垂直连接兼容的数据帧(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 :(得分:0)
为什么在连接之前不重命名列? 除了列的命名外,您的操作没有任何问题。 如果您具有相同名称的列:
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