如何基于site与day分组为Pandas DataFrame添加状态列
解决方法:通过筛选+合并实现分组标记需求
没问题,我来帮你搞定这个需求!既然你不想用groupby的transform()/filter()/agg()方法,我们可以换个思路:先单独提取每个分组的关键判断条件,再把结果合并回原数据,就能轻松得到想要的字段。
步骤1:准备原数据
首先先把你的DataFrame定义好:
import pandas as pd df = pd.DataFrame({ 'site': ['a', 'a', 'a', 'b', 'b', 'b', 'a', 'a', 'a'], 'day': [1, 1, 1, 1, 1, 1, 2, 2, 2], 'hour': [1, 2, 3, 1, 2, 3, 1, 2, 3], 'clicks': [100, 200, 50, 0, 20, 30, 10, 0, 20] })
步骤2:生成分组标记
我们先筛选出hour=1的行,计算每个(site, day)分组对应的判断结果,再把这个结果合并回原数据:
# 提取hour=1的行,生成每个分组的标记 hour1_flags = df[df['hour'] == 1].assign( has_hour_1_clicks=lambda x: x['clicks'] > 0 )[['site', 'day', 'has_hour_1_clicks']] # 合并标记到原DataFrame result_df = df.merge(hour1_flags, on=['site', 'day'], how='left')
步骤3:查看结果
运行后你会得到完全符合需求的DataFrame:
| site | day | hour | clicks | has_hour_1_clicks | |
|---|---|---|---|---|---|
| 0 | a | 1 | 1 | 100 | True |
| 1 | a | 1 | 2 | 200 | True |
| 2 | a | 1 | 3 | 50 | True |
| 3 | b | 1 | 1 | 0 | False |
| 4 | b | 1 | 2 | 20 | False |
| 5 | b | 1 | 3 | 30 | False |
| 6 | a | 2 | 1 | 10 | True |
| 7 | a | 2 | 2 | 0 | True |
| 8 | a | 2 | 3 | 20 | True |
进阶优化(可选)
如果你的数据中存在同一个(site, day)分组下有多条hour=1的记录,我们可以调整逻辑确保判断更严谨(只要有一条hour=1的clicks>0,标记就为True):
hour1_flags = df[df['hour'] == 1].groupby(['site', 'day'])['clicks'].agg( lambda x: any(x > 0) ).reset_index(name='has_hour_1_clicks') result_df = df.merge(hour1_flags, on=['site', 'day'], how='left')
基础版方法完全避开了你提到的transform()/filter()/agg(),只用到了筛选、赋值和合并,完美贴合你的要求!
内容的提问来源于stack exchange,提问作者Ch2231
相关产品推荐
相关产品推荐

