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

时间:2018-12-12 01:04:46

标签: python pandas filter subset

我经常尝试执行以下操作,但是有一个立即解决方案,在熊猫中最有效:

我有以下示例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的所有唯一值保留在列表中,然后遍历数据框以检查重复的行。那将是非常低效的。

此任务有内置功能吗?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

使用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