首页 > 解决方案 > 在多列上合并多个 Pandas 数据框

问题描述

我正在尝试将其他数据帧(DF_BDF_C)合并到DF_A以等于DF_D

将附加数据帧绑定到DF_A的唯一方法是通过列B_2,所以我试图将它们合并到B_2上。我在下面尝试了此代码来合并第一个附加数据帧(DF_B)。

DF_D = pd.merge(DF_A, DF_B, how='left', on='B_2') 

这几乎奏效了,但它正在创建额外的列。

所以我认为添加left_on=可能有效,但没有。

DF_D = pd.merge(DF_A, DF_B, how='left', left_on=['B_2','C_3', 'D_4'])


我正在寻找一种在主数据帧上写入额外数据帧的方法,直到 DF_D 被填写。此外,即使在合并期间没有匹配项,我也希望 DF_D 保留所有其他行和原始列/名称。

原始主数据框A:

     A_1   B_2 C_3   D_4
0  03/17  3001          
1  03/17  2002   L  BLUE
2  03/17  3777          
3  04/17  5555          
4  04/17  3232          
5  04/17  5000          
6  04/17  5151          
7  05/17  2212   S   RED

附加数据框 B:

    B_2 C_3    D_4
0  3001   M   GRAY
1  3131   S   BLUE
2  3333  XS  GREEN
3  3232   L   PINK
4  3000   M    RED

像这样使用:

DF_1 = pd.merge(DF_A, DF_B, how='left', on='B_2')

附加数据框 C:

    B_2 C_3    D_4
0  5151   S   BLUE
1  5545   M   PINK
2  5555  XL    RED
3  5222   L   GRAY
4  5112   S  GREEN

像这样使用:

DF_D = pd.merge(DF_1, DF_C, how='left', on='B_2')

结果,最终 DF_D:

     A_1   B_2 C_3   D_4
0  03/17  3001   M  GRAY
1  03/17  2002   L  BLUE
2  03/17  3777          
3  04/17  5555  XL   RED
4  04/17  3232   L  PINK
5  04/17  5000          
6  04/17  5151   S  BLUE
7  05/17  2212   S   RED

标签: python-3.xpandasmerge

解决方案


听起来你想要这样的东西:

# Make DF_A look like DF_B and DF_C. Same columns, no missing values.
DF_A_filt = DF_A[['B_2', 'C_3', 'D_4']]
DF_A_filt = DF_A_filt[DF_A_filt['C_3'].notnull()]

# Put all the "feature" data together.
df_data = pd.concat([DF_A_filt, DF_B, DF_C], ignore_index=True)

# Drop duplicates by the join key B_2 to keep only the first match.
# This will prefer DF_A, then DF_B, then DF_C.
df_data = df_data.drop_duplicates('B_2')

# Merge the features back onto the keys by B_2.
DF_D = DF_A[['A_1', 'B_2']].merge(df_data, on='B_2', how='left')

一路上的数据是这样的:

DF_A_filt                                                                                                                                                                                                                           
#     B_2 C_3   D_4
# 1  2002   L  BLUE
# 7  2212   S   RED

df_data
#      B_2 C_3    D_4
# 0   2002   L   BLUE
# 1   2212   S    RED
# 2   3001   M   GRAY
# 3   3131   S   BLUE
# 4   3333  XS  GREEN
# 5   3232   L   PINK
# 6   3000   M    RED
# 7   5151   S   BLUE
# 8   5545   M   PINK
# 9   5555  XL    RED
# 10  5222   L   GRAY
# 11  5112   S  GREEN

DF_D
     A_1   B_2  C_3   D_4
# 0  03/17  3001    M  GRAY
# 1  03/17  2002    L  BLUE
# 2  03/17  3777  NaN   NaN
# 3  04/17  5555   XL   RED
# 4  04/17  3232    L  PINK
# 5  04/17  5000  NaN   NaN
# 6  04/17  5151    S  BLUE
# 7  05/17  2212    S   RED

推荐阅读