我有两个包含四列和两列的数据框。例如:
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
我怎样才能得到这个输出(我的实际数据帧非常大,无法遍历它们,所以需要一种快速高效的方法)?
最佳答案
我会通过首先排序,然后使用 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
关于python - 当特定数量不在特定列中时如何删除数据框的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56511124/