python-3.x - 在多列上合并多个 Pandas 数据框
问题描述
我正在尝试将其他数据帧(DF_B,DF_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
解决方案
听起来你想要这样的东西:
# 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
推荐阅读
- c# - Apache Ignite 在扩展集群中是否支持 PartitionAwareness?
- c++ - C++ setiosflags 函数操纵器 - 未确定的缩进
- json - 处理 SSLError:Windows 上的 CERTIFICATE_VERIFY_FAILED
- javascript - 更新 mongodb 中的空数组字段
- c# - 如何从 Asp.Net core mvc 调用 Asp.Net core Wep API 服务?
- python - 如何从函数中返回dict?
- c# - SQL查询到linq(linq到实体)
- c# - 为什么返回 0?它应该输出 18446744073709551615,应该适合
- javascript - FOUC:没有任何样式加载的初始页面
- azure - Azure Devops Pipelines 中的循环和数组