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

Pandas分组后如何对每组内的工作日数据应用自定义函数?

解决Pandas GroupBy中仅对组内工作日行应用函数的问题

我明白你的问题了——你现在用groupby.filter()的方式是在保留整个组(只要组里至少有一个工作日记录),但你真正想要的是在每个user1-user2组里只留下工作日的行,再对这些行应用自定义函数。

问题出在哪?

groupby.filter()的作用是筛选整个分组:你传入的lambda返回的布尔值决定了整个组是否被保留,而不是筛选组内的行。你的代码lambda x: (x.day <5).any()会保留所有包含至少一条工作日记录的组,但组里的非工作日行依然会被保留,这和你的需求不符。

正确的解决方案

这里有两种高效的实现方式,你可以根据自己的需求选择:

方式一:先筛选工作日行,再分组应用函数(推荐,更高效)

先把所有工作日的行筛选出来,再按user1-user2分组,这样后续分组操作只处理需要的数据:

# 第一步:标记工作日(你已经完成这步了)
df['day'] = df['date'].dt.weekday

# 第二步:筛选所有工作日的行(day <5 对应周一到周五)
df_weekday = df[df['day'] < 5]

# 第三步:分组并应用自定义函数func
result = df_weekday.groupby(['user1', 'user2']).apply(func)

方式二:在分组内筛选工作日行后应用函数

如果需要处理那些没有工作日记录的组(比如返回空值或特定默认值),可以用groupby.apply()在每个组内先筛选再处理:

# 标记工作日
df['day'] = df['date'].dt.weekday

def process_weekday_group(group):
    # 筛选当前组内的工作日行
    weekday_rows = group[group['day'] < 5]
    # 如果组内没有工作日行,可根据需求返回空或默认值
    if weekday_rows.empty:
        return pd.Series()  # 或者返回比如pd.Series({'result': 0})
    # 对工作日行应用自定义函数
    return func(weekday_rows)

# 分组处理
result = df.groupby(['user1', 'user2']).apply(process_weekday_group)

举个实际例子

用你提供的DataFrame:

user1user2datequantityday
AliceBob2018-05-211000
AliceBob2018-05-19205
AliceCarol2018-01-0110000
BobCarol2018-02-011003

用方式一处理后,df_weekday会去掉Alice-Bob组里的2018-05-19那行,然后分组后每个组只包含工作日数据,再应用你的func。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:22:40