在Pandas中的列中删除具有非唯一值的行

时间:2016-08-18 21:01:59

标签: pandas duplicates

我有一个如下所示的数据框:

| id   | col1 | col2 | col3 | col4 |
|------|------|------|------|------|
| 1    | A    | B    | C    | 0    |
| 2    | M    | 0    | M    | 0    |
| 3    | B    | B    | 0    | B    |
| 4    | X    | 0    | Y    | 0    |

我想忽略任何在各自列中只有一个唯一值的行。我最终得到了这个:

| id   | col1 | col2 | col3 | col4 |
|------|------|------|------|------|
| 1    | A    | B    | C    | 0    |
| 4    | X    | 0    | Y    | 0    |

这是一件看似简单的事情。但我似乎无法找到关于如何在Pandas中执行此操作的任何提示,因为人们似乎最感兴趣的是删除与其他行重复的行,而不是那些在行本身中只有重复值的行。 / p>

df = [    {'id' : 1, 'col1' : 'A', 'col2': 'B', 'col3':   'C', 'col4':'0'},
          {'id' : 2, 'col1' : 'M', 'col2':   '0', 'col3': 'M', 'col4':'0'},
          {'id' : 3, 'col1' : 'B', 'col2':  'B', 'col3':  '0', 'col4':'0'},
          {'id' : 4, 'col1' : 'X', 'col2':  '0', 'col3':  'Y', 'col4':'0'}
          ]
df = pd.DataFrame(df)
df = df[['col1', 'col2', 'col3', 'col4']]
df

小注意:在我的情况下,值'0'实际上是一个字符串 此时所有行至少有一个值。

2 个答案:

答案 0 :(得分:2)

尝试:

df[df.apply(lambda x: x[x != '0'].nunique(), axis=1) > 1]

enter image description here

使用'id'

df.set_index('id')[df.set_index('id').apply(lambda x: x[x != '0'].nunique(), axis=1) > 1].reset_index()

enter image description here

答案 1 :(得分:0)

解决方案是查看转置的数据框并搜索重复项。

您可以这样做:

url('^registration/', views.WHATEVER_VIEW_YOU_WANT_USE)

这将为您提供布尔系列,其中行具有重复项并使用此系列过滤您的数据框。