- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设我有两个数据框,两者的列名是:
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()
。然后删除所有 A
和 B
匹配的重复案例(感谢@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]
上的 A
和 B
/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 = 4
和 B = 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/
我是一名优秀的程序员,十分优秀!