Pandas按条件过滤整组:保留含全部3个工作日且各日计数≥2的组
Pandas分组过滤实现
输入数据(最小可复现示例)
import pandas as pd data = {'Name': ['Tom', 'Tom', 'Tom', 'Tom', 'Tom', 'Tom', 'Tom' , 'Tom', 'Tom', 'Tom'], 'Article': ['A', 'A', 'A', 'B', 'B', 'A', 'A', 'A', 'B', 'B'], 'Weekday' : [1,2,3,2,3,1,2,3, 1, 2], 'Value': [1,40,3,91,10,6,9,10, 20, 10]} df_test = pd.DataFrame(data)
原始数据展示:
Name Article Weekday Value 0 Tom A 1 1 1 Tom A 2 40 2 Tom A 3 3 3 Tom B 2 91 4 Tom B 3 10 5 Tom A 1 6 6 Tom A 2 9 7 Tom A 3 10 8 Tom B 1 20 9 Tom B 2 10
过滤规则
按Name-Article组合分组,仅保留同时满足以下条件的组:
- 组内包含全部3个工作日(1、2、3)
- 每个工作日对应的记录数至少为2条
注:仅包含2个工作日的组,即便记录数达标也需过滤。
预期输出
Name Article Weekday Value 0 Tom A 1 1 1 Tom A 2 40 2 Tom A 3 3 5 Tom A 1 6 6 Tom A 2 9 7 Tom A 3 10
实现代码
# 定义分组过滤逻辑 def filter_valid_groups(group): # 检查是否覆盖全部3个工作日 covers_all_days = set(group['Weekday']) == {1, 2, 3} # 检查每个工作日的记录数都不低于2条 meets_min_count = group['Weekday'].value_counts().min() >= 2 return covers_all_days and meets_min_count # 应用过滤得到结果 filtered_df = df_test.groupby(['Name', 'Article']).filter(filter_valid_groups) print(filtered_df)
代码说明
groupby(['Name', 'Article']):按指定的两个字段完成分组filter(filter_valid_groups):对每个分组执行自定义过滤函数- 过滤函数内:
- 通过集合对比判断组内是否包含全部3个工作日
- 用
value_counts()统计各工作日的记录数,取最小值判断是否都达标 - 两个条件同时满足时,保留该分组的所有数据
内容的提问来源于stack exchange,提问作者Vala
相关产品推荐
相关产品推荐

