Python 当特定数量不在特定列中时,如何删除数据帧的行?
我有两个数据帧,有四列和两列。例如:Python 当特定数量不在特定列中时,如何删除数据帧的行?,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有两个数据帧,有四列和两列。例如: 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列在第一个数据帧中的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 2 6 300 550
3 4 6 100 300
4 5 2 250 360
及
我需要比较第一个数据帧和第二个数据帧,如果第二个数据帧中的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
我怎样才能得到这个输出(我的实际数据帧太大了,不能遍历它们,所以需要一种快速有效的方法)?我会先排序,然后使用带有指示器的
合并执行左外连接,以确定要保留哪些行。例如
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
有关使用指示器连接的更多信息,请参见我的帖子:
如果不关心最终结果是否被排序,可以将其简化为内部联接
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
我将如何使用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
使用
输出
A B C D
0 4 2 320 700
1 5 7 400 800
4 5 2 250 360
一个简单的内部联接在这里就足够了,还是我遗漏了什么?@Erfan它不会,因为在合并之前需要对列进行排序,同时我不希望最终输出也进行排序。@Erfan为了清晰起见进行了编辑。在第一个解决方案中,是否可以只使用u
和df2
的内部连接的索引进行切片?@cs95我尝试过,但它失败了,因为解决方案试图将df.index
与布尔掩码的索引对齐。是的,考虑过这一点。这是一条很好的单行线,但速度很慢p@cs95是的,相当慢:-)我完全同意:-)@cs95为什么慢?请解释一下。这个解释将帮助我更好地学习python。谢谢。@mnm使用apply通常很慢,使用对象也很慢,因为代码无法矢量化。
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