当特定数量不在特定列中时,如何删除数据框的行?

时间:2019-06-09 00:32:17

标签: 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  
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

如何获取此输出(我的实际数据帧非常大,无法迭代它们,因此需要一种快速有效的方法)?

3 个答案:

答案 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)

使用np.equal.outer

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