跨列删除具有相同单元格值的任何行

时间:2019-09-12 15:13:29

标签: python pandas

我找不到解决此问题的任何方法; this is the closest I guess, but I can't figure out how to implement the ideas here.

我以某种方式发现自己正在看这样的数据框:

data = [['apple', 'banana','pear','mango'], ['pasta', 'pasta','pasta','pasta'], ['onion', 'tomato','celery','potato'], ['dog', 'dog','dog','dog']]
df = pd.DataFrame(data) 
df 

哪个输出:

        0   1         2     3
0   apple   banana  pear    mango
1   pasta   pasta   pasta   pasta
2   onion   tomato  celery  potato
3   dog     dog     dog     dog

第二行和第四行在所有4列中都具有相同的值,而我想摆脱它们,因此最终的df如下所示:

        0   1         2     3
0   apple   banana  pear    mango
1   onion   tomato  celery  potato

使用drop_duplicates()不会执行任何操作,因为没有重复的行。与duplicated()相同。

以下是我能想到的唯一想法(如果可以这样称呼)。如果我跑

df.transpose()

我明白了

        0   1       2        3
0   apple   pasta   onion   dog
1   banana  pasta   tomato  dog
2   pear    pasta   celery  dog
3   mango   pasta   potato  dog

现在,如果我在第4列上运行duplicated()

df.duplicated(3)

我明白了

0    False
1     True
2     True
3     True
dtype: bool

因此,也许我可以提出一个将df转置的函数,在每列上运行duplicated(),如果除第一个以外的所有值都返回True,则将该列删除将df变回其原始形状。

但是我不知道该怎么做。另外,我想知道是否有更优雅的到达同一个地方的方法。

1 个答案:

答案 0 :(得分:3)

您可以将axis=1df.nunique()一起使用,并检查所有列的唯一值均超过1的行。

每个文档:nunique()

  

计算请求轴上的不同观测值。

因此,如果我们进行测试:

df.nunique(1)

这将输出:

0    4
1    1
2    4
3    1

自然地

df.nunique(1)>1

会返回:

0     True
1    False
2     True
3    False

因此,在boolean indexing的帮助下,我们可以做到:

df[df.nunique(1)>1]

哪个返回所需的输出:

       0       1       2       3
0  apple  banana    pear   mango
2  onion  tomato  celery  potato