如果所有列彼此相等,如何从数据框中删除行?

时间:2017-03-08 15:41:18

标签: python pandas

我理解如果给定列等于某个值,如何删除行,例如

df = df.drop(df[<some boolean condition>].index)

但是如果列彼此相等,你如何删除一行?有没有办法在不指定列名的情况下执行此操作?

2 个答案:

答案 0 :(得分:1)

您可以使用apply方法循环遍历行并创建一个逻辑系列,指示每个行是否包含唯一值,并使用布尔序列删除相应的行:

df[df.apply(lambda r: r.nunique() != 1, 1)]

df = pd.DataFrame({"A": [1,2,3,3,3,4,5], "B": [1,3,4,4,3,5,1]})
In [867]:

df[df.apply(lambda r: r.nunique() != 1, 1)]
Out[867]:
    A   B
1   2   3
2   3   4
3   3   4
5   4   5
6   5   1

答案 1 :(得分:1)

您可以使用.eq将第一列与整个df进行比较,并指定axis=0并在结果上调用all并使用~进行反转:

In [158]:
df = pd.DataFrame({'a':np.arange(5), 'b':[0,0,2,2,4]})
df

Out[158]:
   a  b
0  0  0
1  1  0
2  2  2
3  3  2
4  4  4

In [159]:    
df[~df.eq(df['a'], axis=0).all(axis=1)]

Out[159]:
   a  b
1  1  0
3  3  2

如果你看一下布尔掩码:

In [160]:
df.eq(df['a'], axis=0)

Out[160]:
      a      b
0  True   True
1  True  False
2  True   True
3  True  False
4  True   True

您可以看到满足条件的行是正确的,因此调用all(axis=1)会返回1-D布尔掩码:

In [161]:
df.eq(df['a'], axis=0).all(axis=1)

Out[161]:
0     True
1    False
2     True
3    False
4     True
dtype: bool