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:
| user1 | user2 | date | quantity | day |
|---|---|---|---|---|
| Alice | Bob | 2018-05-21 | 100 | 0 |
| Alice | Bob | 2018-05-19 | 20 | 5 |
| Alice | Carol | 2018-01-01 | 1000 | 0 |
| Bob | Carol | 2018-02-01 | 100 | 3 |
用方式一处理后,df_weekday会去掉Alice-Bob组里的2018-05-19那行,然后分组后每个组只包含工作日数据,再应用你的func。
内容的提问来源于stack exchange,提问作者irene
相关产品推荐
相关产品推荐

