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

在Pandas中通过GroupBy按ID判断两阶段数值阈值生成指标列

实现方案:为每个ID标记pre/post阶段n值是否均≥5(禁用pivot_table)

原始数据

import pandas as pd
df = pd.DataFrame({
    'id': [1,1,2,2,3,3],
    'phase': ['pre', 'post','pre', 'post','pre', 'post'],
    'n': [5,6,7,3,10,10]
})

预期输出

pd.DataFrame({
    'id': [1,1,2,2,3,3],
    'phase': ['pre', 'post','pre', 'post','pre', 'post'],
    'n': [5,6,7,3,10,10],
    'new_col': [1,1,0,0,1,1]
})

具体实现方法

方法1:Groupby + Transform(最简洁)

利用groupby.transform将组内判断结果广播到每一行:

df['new_col'] = df.groupby('id')['n'].transform(lambda x: 1 if (x >= 5).all() else 0)

逻辑:按id分组后,对每组的n列检查所有值是否≥5,transform会把判断结果映射到该组的每一行,直接生成新列。

方法2:Filter筛选有效ID后标记

先筛选出符合条件的ID,再通过isin标记每行:

# 过滤出所有阶段n值都≥5的ID
valid_ids = df.groupby('id').filter(lambda x: (x['n'] >= 5).all())['id'].unique()
# 为每行标记是否属于有效ID
df['new_col'] = df['id'].isin(valid_ids).astype(int)

逻辑:filter会保留满足条件的整组数据,提取这些组的ID后,用isin判断每行ID是否在有效列表中,最后转成整数类型得到1/0标记。

方法3:Groupby聚合后合并

先按ID聚合得到标记结果,再合并回原DataFrame:

# 按ID聚合生成标记列
agg_result = df.groupby('id')['n'].agg(lambda x: 1 if (x >= 5).all() else 0).rename('new_col').reset_index()
# 合并回原数据
df = df.merge(agg_result, on='id', how='left')

逻辑:先对每个ID计算标记值,再通过merge将标记值对应到原数据的每一行,确保每个ID的所有行都获得相同标记。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:10:21