gpt4 book ai didi

python Pandas : How to merge based on an "OR" condition?

转载 作者:太空狗 更新时间:2023-10-30 01:11:57 26 4
gpt4 key购买 nike

假设我有两个数据框,两者的列名是:

table 1 columns:
[ShipNumber, TrackNumber, ShipDate, Quantity, Weight]
table 2 columns:
[ShipNumber, TrackNumber, AmountReceived]

我想合并基于 ShipNumber 和 TrackNumber 的两个表。但是,如果我简单地按以下方式使用合并(伪代码,不是真正的代码):

tab1.merge(tab2, "left", on=['ShipNumber','TrackNumber'])

那么,这意味着两个表中的 ShipNumber 和 TrackNumber 列中的值必须匹配。

但是,在我的例子中,有时 ShipNumber 列值会匹配,有时 TrackNumber 列值会匹配; 只要两个值之一匹配一行,我就希望合并发生。

换句话说,如果tab 1中的第1行ShipNumber与tab 2中的第3行ShipNumber匹配,但是两条记录的两个表中的TrackNumber不匹配,我仍然想匹配两个表中的两行。

所以基本上这是一个非此即彼的匹配条件(伪代码):

if tab1.ShipNumber == tab2.ShipNumber OR tab1.TrackNumber == tab2.TrackNumber:
then merge

我希望我的问题是有道理的...非常感谢任何帮助!

按照建议,我查看了这篇文章: Python pandas merge with OR logic但这不是我认为的完全相同的问题,因为该帖子的 OP 有一个映射文件,因此他们可以简单地进行 2 次合并来解决这个问题。但是我没有映射文件,而是有两个具有相同键列(ShipNumber、TrackNumber)的 df

最佳答案

使用merge()concat()。然后删除所有 AB 匹配的重复案例(感谢@Scott Boston 最后一步)。

df1 = pd.DataFrame({'A':[3,2,1,4], 'B':[7,8,9,5]})
df2 = pd.DataFrame({'A':[1,5,6,4], 'B':[4,1,8,5]})

df1 df2
A B A B
0 3 7 0 1 4
1 2 8 1 5 1
2 1 9 2 6 8
3 4 5 3 4 5

有了这些数据框,我们应该看到:

  • df1.loc[0]df2.loc[0]
  • 上匹配 A
  • df1.loc[1]df2.loc[2]
  • 上匹配 B
  • df1.loc[3] 匹配 df2.loc[3] 上的 AB/li>

我们将使用后缀来跟踪匹配的内容:

suff_A = ['_on_A_match_1', '_on_A_match_2']
suff_B = ['_on_B_match_1', '_on_B_match_2']

df = pd.concat([df1.merge(df2, on='A', suffixes=suff_A),
df1.merge(df2, on='B', suffixes=suff_B)])

A A_on_B_match_1 A_on_B_match_2 B B_on_A_match_1 B_on_A_match_2
0 1.0 NaN NaN NaN 9.0 4.0
1 4.0 NaN NaN NaN 5.0 5.0
0 NaN 2.0 6.0 8.0 NaN NaN
1 NaN 4.0 4.0 5.0 NaN NaN

请注意,第二行和第四行是重复匹配项(对于两个数据框,A = 4B = 5)。我们需要删除其中一组。

dups = (df.B_on_A_match_1 == df.B_on_A_match_2) # also could remove A_on_B_match
df.loc[~dups]

A A_on_B_match_1 A_on_B_match_2 B B_on_A_match_1 B_on_A_match_2
0 1.0 NaN NaN NaN 9.0 4.0
0 NaN 2.0 6.0 8.0 NaN NaN
1 NaN 4.0 4.0 5.0 NaN NaN

关于 python Pandas : How to merge based on an "OR" condition?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45869886/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com