我找不到解决此问题的任何方法; 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变回其原始形状。
但是我不知道该怎么做。另外,我想知道是否有更优雅的到达同一个地方的方法。
答案 0 :(得分:3)
您可以将axis=1
与df.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