You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

代码说明

  1. groupby(['Name', 'Article']):按指定的两个字段完成分组
  2. filter(filter_valid_groups):对每个分组执行自定义过滤函数
  3. 过滤函数内:
    • 通过集合对比判断组内是否包含全部3个工作日
    • 用value_counts()统计各工作日的记录数,取最小值判断是否都达标
    • 两个条件同时满足时,保留该分组的所有数据

内容的提问来源于stack exchange,提问作者Vala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 15:37:43