在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
相关产品推荐
相关产品推荐

