我有两个具有四列和两列的数据帧。例如:
A B C D
0 4 2 320 700
1 5 7 400 800
2 2 6 300 550
3 4 6 100 300
4 5 2 250 360
和
A B
0 2 4
1 5 7
2 2 5
我需要比较第一数据帧和第二数据帧,以及第二数据帧中的列A和列B是否在第一数据帧中的列A和列B中。 (顺序无关紧要。这意味着在第一行的第一个数据帧中,A为4,B为2,在第二个数据帧中,A为2,B为4,这并不重要,但两个数字都应位于列)将整个行保留在第一个数据帧中;否则,请删除该行。所以输出将是:
A B C D
0 4 2 320 700
1 5 7 400 800
2 5 2 250 360
如何获取此输出(我的实际数据帧非常大,无法迭代它们,因此需要一种快速有效的方法)?
答案 0 :(得分:2)
我将首先进行排序,然后使用带有指示符的merge
执行LEFT OUTER JOIN,以确定要保留的行。例子
u = df.loc[:, ['A', 'B']]
u.values.sort() # sort columns of `u`
df2.values.sort() # sort columns of `df2`
df[u.merge(df2, how='left', indicator='ind').eval('ind == "both"').values]
A B C D
0 4 2 320 700
1 5 7 400 800
4 5 2 250 360
有关带有指示符的联接的更多信息,请参见我的帖子:Pandas Merging 101
如果您不关心是否对最终结果进行排序,可以将其简化为内部联接。
df[['A', 'B']] = np.sort(df[['A', 'B']])
df2[:] = np.sort(df2)
df.merge(df2, on=['A', 'B'])
A B C D
0 2 4 320 700
1 5 7 400 800
2 2 5 250 360
答案 1 :(得分:1)
使用frozenset
+ isin
yourdf=df[df[['A','B']].apply(frozenset,1).isin(df1.apply(frozenset,1))].copy()
A B C D
0 4 2 320 700
1 5 7 400 800
4 5 2 250 360
答案 2 :(得分:0)
arr = np.equal.outer(df, df2)
df.loc[arr.any(1).all(-1).any(-1)]
输出
A B C D
0 4 2 320 700
1 5 7 400 800
4 5 2 250 360