串联/合并数据框

时间:2020-09-24 09:08:13

标签: python pandas dataframe

我有很多数据框,我需要合并/连接所有它们。 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'])

随附的是数据框的图片以及我想看到的结果。

有人可以在这里帮助我。 enter image description here

2 个答案:

答案 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