如何在pandas DataFrame中仅保留具有多个值的行?

4
我经常尝试执行以下操作,但在pandas中有一种最有效的即时解决方案:
我有以下示例pandas DataFrame,其中有两列,NameAge:
import pandas as pd

data = [['Alex',10],['Bob',12],['Barbara',25], ['Bob',72], ['Clarke',13], ['Clarke',13], ['Destiny', 45]]

df = pd.DataFrame(data,columns=['Name','Age'], dtype=float)

print(df)
      Name   Age
0     Alex  10.0
1      Bob  12.0
2  Barbara  25.0
3      Bob  72.0
4   Clarke  13.0
5   Clarke  13.0
6  Destiny  45.0

我希望删除所有在Name列中有重复值的行。在这个例子中的df数据框中,有两个Bob和两个Clarke。因此,期望的输出如下:
      Name   Age
0      Bob  12.0
1      Bob  72.0
2   Clarke  13.0
3   Clarke  13.0

我假设已经存在重置索引的方法。

一种选项是将所有唯一的Name值存储在列表中,然后遍历数据框以检查重复行。这将非常低效。

是否有内置函数可以执行此任务?


1
请查看 pd.duplicated - hilberts_drinking_problem
请关闭这个问题;这很尴尬。 - EB2127
2个回答

4
使用duplicated函数
df[df.Name.duplicated(keep=False)]
     Name   Age
1     Bob  12.0
3     Bob  72.0
4  Clarke  13.0
5  Clarke  13.0

3
或许可以加上.reset_index(drop=1)后缀以获得额外的分数? - Samveen

3
使用 drop_duplicates,只获取被删除的项:
print(df[~df['Name'].isin(df['Name'].drop_duplicates(False))])

输出:

     Name   Age
1     Bob  12.0
3     Bob  72.0
4  Clarke  13.0
5  Clarke  13.0

如果关注指数,请执行以下操作:

print(df[~df['Name'].isin(df['Name'].drop_duplicates(False))].reset_index(drop=1))

输出:

     Name   Age
0     Bob  12.0
1     Bob  72.0
2  Clarke  13.0
3  Clarke  13.0

2
好的回答,如果你对直接的方式感兴趣。 - BENY
1
很多研究都在回答这个问题,而我发现你的答案正是我得到的代码... - Samveen
@Samveen 很高兴你找到了这个,而且它有所帮助 :-) - U13-Forward
1
@U9-Forward,这让我想到了一个问题,回答这个问题花费了我15分钟的时间。这让你对这个问题产生了疑问,不是吗?;-) - Samveen
1
@Samveen 你好,我正在尝试让管理员删除这个问题,因为它太显然了。请请求将其删除。 - EB2127
@EB2127 请不要这样做!删除已经有有用答案的问题并不好,所以请接受我的或W-B的答案。 - U13-Forward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接