将 DF 与 OR 条件合并三个常见列

问题描述 投票:0回答:1

阅读最近更新的这篇旧文章如何根据“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
python merge concatenation
1个回答
0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.