使用groupby和value计数后如何进一步过滤数据帧

时间:2020-07-10 22:32:44

标签: python

我目前正在处理庞大的数据集,但在过滤数据时遇到了一些麻烦。我有一个类似

的数据框
Name  Activity
John  Cleaning
Mary  Driving
Peter Cleaning 
John  Driving

,以此类推一百万行。我应用了df.groupby('Name')['activity'].valuecounts(),并得到了一个看起来像

的数据框
Name  Activity
John  Cleaning 3
      Driving  2
      Walking  1
Mary  Cleaning 1
      Driving  1 
      Walking  1
Peter Cleaning 1

我想通过仅提取那些具有大于1的活动的最大值计数的名称来进一步过滤该名称,但是我不确定该怎么做。也就是说,在此示例中,我只想让John作为输出,我将不胜感激

1 个答案:

答案 0 :(得分:0)

如果每一行看起来像Name Activity,并且没有其他列,那么您实际上要执行的操作是根据名称是否包含在任何重复的行中来过滤名称。一种方法如下:

df = pd.DataFrame([["John",  "Cleaning"], 
     ["John",  "Cleaning"], 
     ["Mary", "Driving"], 
     ["Mary", "Cleaning"], 
     ["Mary", "Walking"], 
     ["John", "Driving"],
     ["Peter", "Cleaning"], 
     ["John", "Driving"], 
     ["John", "Cleaning"],
     ["John", "Walking"]],
     columns=["Name", "Activity"])

result = df[
  df['Name'].isin(df[df.duplicated()]['Name'])
  ].groupby('Name')['Activity'].value_counts()

print(result)

如果您还有其他列未在此处显示,则可以使用duplicated(subset=["Name", "Activity"])

输出:

Name  Activity
John  Cleaning    3
      Driving     2
      Walking     1

编辑

如果您只需要名称而不是任何活动,则可以使用

df[df.duplicated()]['Name'].unique()