如何基于分组结果筛选含多个重复日期的Category所有行?
Pandas筛选含多个重复日期的类别行方案
原始数据
首先定义问题中的DataFrame:
import pandas as pd data= [['A','2022-07-01',3],['A','2022-07-01',4],['A','2022-07-01',5],['A','2022-07-02',5],['A','2022-07-03',6],['A','2022-07-03',2],['B','2022-07-01',3],['B','2022-07-01',4],['B','2022-07-02',5],['B','2022-07-02',6],['B','2022-07-03',2],['C','2022-07-01',3],['C','2022-07-02',4],['C','2022-07-02',5],['C','2022-07-03',6],['C','2022-07-04',2]] df = pd.DataFrame(data,columns =['category','date','Value'])
需求说明
需要筛选出所属category中存在至少两个不同日期对应多条记录的所有行:
- Category A:2022-07-01(3条)、2022-07-03(2条),符合条件
- Category B:2022-07-01(2条)、2022-07-02(2条),符合条件
- Category C:仅2022-07-02有重复记录,不符合条件需排除
解决方案
通过多轮分组统计锁定符合条件的类别,再筛选原始数据:
分步实现
- 统计每个
(category, date)组合的记录数:
date_group_counts = df.groupby(['category', 'date']).size().reset_index(name='record_num')
- 筛选出记录数大于1的
(category, date)组合(即该类别下的重复日期):
duplicate_date_groups = date_group_counts[date_group_counts['record_num'] > 1]
- 统计每个category下有多少个这样的重复日期:
cat_duplicate_date_count = duplicate_date_groups.groupby('category').size().reset_index(name='dup_date_count')
- 筛选出重复日期数量≥2的category:
valid_categories = cat_duplicate_date_count[cat_duplicate_date_count['dup_date_count'] >= 2]['category']
- 用符合条件的category筛选原始DataFrame:
final_result = df[df['category'].isin(valid_categories)]
链式简化版
可以把上述步骤合并为一行链式操作,更简洁:
final_result = df[ df['category'].isin( df.groupby(['category', 'date']) .size() .loc[lambda x: x > 1] .reset_index() .groupby('category') .size() .loc[lambda x: x >= 2] .index ) ]
结果验证
打印final_result会得到Category A和B的所有行,Category C的行被排除,完全符合需求。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

