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

如何基于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:

sitedayhourclickshas_hour_1_clicks
0a11100True
1a12200True
2a1350True
3b110False
4b1220False
5b1330False
6a2110True
7a220True
8a2320True

进阶优化(可选)

如果你的数据中存在同一个(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:57:49