Python pandas按id分组后按条件生成新列的实现方法
实现方案
你可以使用groupby()+transform()实现需求,transform会返回与原DataFrame长度一致的序列,可直接赋值为新列,不需要额外对齐索引。
你之前尝试的
filter方法作用是筛选符合条件的分组,仅返回匹配条件的行,无法直接生成全量的新列,transform是这类分组映射需求的首选方法。
完整可运行代码
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'id': ['x1', 'x1', 'x2', 'x2', 'x3'], 'group': ['A', 'B', 'A', 'A', 'B'] }) # 生成new_group列 df['new_group'] = df.groupby('id')['group'].transform( lambda x: 'two' if x.nunique() == 2 else x.iloc[0] if x.nunique() == 1 else 'B' ) print(df)
逻辑说明
按id分组后,对每组的group列做判断:
- 唯一值数量等于2时,返回字符串
two - 唯一值数量等于1时,返回该组唯一的group值(这里取第一个位置的值即可)
- 其余情况返回
B transform会将每组的返回值自动映射到该组的所有行上,不需要额外处理索引对齐
运行后输出结果和你期望的完全一致:
id group new_group 0 x1 A two 1 x1 B two 2 x2 A A 3 x2 A A 4 x3 B B
内容的提问来源于stack exchange,提问作者shsh
相关产品推荐
相关产品推荐

