我目前正在处理庞大的数据集,但在过滤数据时遇到了一些麻烦。我有一个类似
的数据框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作为输出,我将不胜感激
答案 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()