Python:如何删除多个列具有相等值的行?

时间:2019-03-15 07:25:31

标签: python pandas

我想删除多个列具有相同值的行。我读了this question大约两列,并试图扩展到多列,但是出现错误。

以下是一些示例数据,类似于我的数据框:

import pandas as pd
data = [['table1',10,8,7],['table2',3,3,3],['table3',3,8,11],['table4',12,12,12],['table5',13,15,5]]
df = pd.DataFrame(data,columns=['table_name','Attr1','Attr2','Attr3'])

和我想要的结果

res = [['table1',10,8,7],['table3',3,8,11],['table5',13,15,5]]
result = pd.DataFrame(res,columns=['table_name','Attr1','Attr2','Attr3'])

我尝试了

[df[df['Attr1'] != df['Attr2'] | df['Attr1'] != df['Attr3'] | df['Attr2'] != df['Attr3']]]

检索错误

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

有什么想法吗?

4 个答案:

答案 0 :(得分:2)

使用DataFrame.ne通过Attr1列比较所有值,并通过DataFrame.any测试每行至少一个True,最后通过boolean indexing进行过滤:< / p>

df = df[df[['Attr1','Attr2','Attr3']].ne(df['Attr1'], axis=0).any(axis=1)]
print (df)
  table_name  Attr1  Attr2  Attr3
0     table1     10      8      7
2     table3      3      8     11
4     table5     13     15      5

详细信息

print (df[['Attr1','Attr2','Attr3']].ne(df['Attr1'], axis=0))
   Attr1  Attr2  Attr3
0  False   True   True
1  False  False  False
2  False   True   True
3  False  False  False
4  False   True   True

print (df[['Attr1','Attr2','Attr3']].ne(df['Attr1'], axis=0).any(axis=1))
0     True
1    False
2     True
3    False
4     True
dtype: bool

另一种解决方案是通过DataFrame.nunique测试唯一值的数量:

df = df[df[['Attr1','Attr2','Attr3']].nunique(axis=1).ne(1)]

答案 1 :(得分:2)

您可以为每个条件创建条件,然后进行比较:

c1 = df['Attr1'].ne(df['Attr2'])
c2 = df['Attr1'].ne(df['Attr3'])
c3 = df['Attr2'].ne(df['Attr3'])
>>> df[c1 | c2 | c3]
  table_name  Attr1  Attr2  Attr3
0     table1     10      8      7
2     table3      3      8     11
4     table5     13     15      5

每个条件都是一个表示不等式是否成立的序列,例如

>>> c1
0     True
1    False
2     True
3    False
4     True
dtype: bool

>>> c1 | c2 | c3
0     True
1    False
2     True
3    False
4     True
dtype: bool

答案 2 :(得分:2)

布尔索引,条件是轴1上唯一值的数量必须等于DataFrame的宽度:

df = df[df.nunique(axis=1).eq(df.shape[1])]

答案 3 :(得分:2)

使用df.query:

df = df.query("Attr1 != Attr2 != Attr3")