我理解如果给定列等于某个值,如何删除行,例如
df = df.drop(df[<some boolean condition>].index)
但是如果列彼此相等,你如何删除一行?有没有办法在不指定列名的情况下执行此操作?
答案 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