阅读最近更新的这篇旧文章如何根据“OR”条件合并数据帧。在该示例中,有 2 个可能的列可以合并,在本例中,有 3 个 A、B 和 C,其中 C 是一个字符串。
两个 df 可以匹配 A、B 或 C 的任意组合。并且每个 df 都会自行生成唯一的合并记录。使用上面的例子作为指导,但运气不佳。
感谢任何帮助!
DF2
A | B | C | D |
---|---|---|---|
123 | 321 | abc | 公司1 |
456 | rss | 公司2 | |
321 | 432 | xyz | 公司3 |
荷航 | 公司4 |
DF1
A | B | C | F | G |
---|---|---|---|---|
123 | abc | 活跃 | 650 | |
456 | 活跃 | 754 | ||
321 | 432 | 活跃 | 820 | |
荷航 | 活跃 | 840 |
工作代码
suff_A = ['_on_A_match_1', '_on_A_match_2', '_on_A_Match_3']
suff_B = ['_on_B_match_1', '_on_B_match_2', '_on_B_match_3']
suff_C = ['_on_C_match_1', '_on_C_match_2', '_on_C_match_3']
在这件作品上收到错误消息,需要解压太多值
DF3 = pd.concat([DF1.merge(DF2, on='A', suffixes=suff_A),
DF1.merge(DF2, on='B', suffixes=suff_B),
DF1.merge(DF2, on='C', suffixes=suff_C)])
duplicates = (DF3.A_on_B_match_1 == DF3.A_on_B_match_2 == DF3.A_on_C_match_3,
DF3.B_on_A_match_1 == DF3.B_on_A_match_2 == DF3.B_on_C_match_3,
kbd>DF3.C_on_A_match_1 == DF3.C_on_B_match_2)
DF3.loc[~duplicates]
预期结果
A | B | C | D | F | G |
---|---|---|---|---|---|
123 | 321 | abc | 公司1 | 活跃 | 650 |
456 | rss | 公司2 | 活跃 | 754 | |
321 | 432 | xyz | 公司3 | 活跃 | 820 |
荷航 | 公司4 | 活跃 | 840 |
DF3 = pd.concat([
DF1.merge(DF2, on='A'),
DF1.merge(DF2, on='B'),
DF1.merge(DF2, on='C')
])
print(DF3.drop_duplicates().reset_index(drop=True))
打印
A B_x C_x F G B_y C_y D A_x B A_y C
0 123 abc active 650 321 abc company1 NaN NaN NaN NaN
1 456 active 754 456 rss company2 NaN NaN NaN NaN
2 456 active 754 klm company4 NaN NaN NaN NaN
3 klm active 840 456 rss company2 NaN NaN NaN NaN
4 klm active 840 klm company4 NaN NaN NaN NaN
5 321 432 active 820 432 xyz company3 NaN NaN NaN NaN
6 NaN NaN abc active 650 NaN klm company4 123 NaN
7 NaN NaN klm active 840 NaN klm company4 NaN
8 NaN NaN active 754 NaN rss company2 456 NaN
9 NaN NaN active 820 NaN xyz company3 321 432 321 NaN
10 NaN NaN active 650 321 NaN company1 123 NaN 123 abc
11 NaN NaN active 840 NaN company4 NaN klm