【问题标题】:How to only keep rows which have more than one value in a pandas DataFrame?如何只保留熊猫数据框中具有多个值的行?
【发布时间】:2019-05-13 01:30:41
【问题描述】:

我经常尝试做以下操作,但是有一个直接的解决方案,在 pandas 中最有效:

我有以下示例 pandas DataFrame,其中有两列,Name 和 Age:

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

这个任务有内置函数吗?

【问题讨论】:

  • 查看pd.duplicated。
  • 请关闭此问题;好尴尬

标签: python pandas filter subset


【解决方案1】:

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

【讨论】:

  • 也许添加一个.reset_index(drop=1) 后缀以获得额外的信用?
【解决方案2】:

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

【讨论】:

  • 好答案,如果您对直接方式感兴趣
  • 大量研究来回答这个问题,我发现你的答案正是我得到的代码......
  • @Samveen 很高兴你找到了这个,并且有帮助:-)
  • @U9-Forward 这让我想到我花了 15 分钟的研究来回答这个问题。让你想知道这个问题,不是吗;-)。
  • @Samveen 您好,我正试图让版主删除这个问题,因为它太明显了。请要求将其删除
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
相关资源
最近更新 更多