Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当特定数量不在特定列中时,如何删除数据帧的行?_Python_Python 3.x_Pandas - Fatal编程技术网

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