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

Pandas按多列分组后基于非分组列条件为原表新增列的实现问题

Pandas 多列分组赋值解决方案

你之前merge行数超出预期的核心原因是:未对筛选出的匹配值做去重处理,如果单个(cat, subcat)分组下存在多个bin==1的行,左连接时会生成笛卡尔积导致行数膨胀。以下是两种可行实现方案:


方案1:groupby + transform(更简洁,无需合并)

直接在原DataFrame上操作,不需要额外合并步骤,执行效率更高:

# 逻辑:先将非bin==1的value置为NaN,按分组取第一个非空值广播到组内所有行
df['new_value'] = df['value'].where(df['bin'] == 1).groupby([df['cat'], df['subcat']]).transform('first')

如果你的场景中可能存在单个分组下多个bin==1的行,可以把'first'替换为你需要的聚合逻辑,比如'max'/'min'/'mean'等。


方案2:修复merge方案

如果偏好使用merge实现,只需要先对筛选出的匹配值做去重处理,避免重复匹配即可:

# 先对分组匹配值去重,保证每个(cat, subcat)只有一条匹配记录
vals = df[df['bin'] == 1][['cat', 'subcat', 'value']].drop_duplicates(subset=['cat', 'subcat'], keep='first')
df_merged = pd.merge(left = df, right = vals,  how = "left", on = ['cat','subcat'], suffixes=('', '_new'))
# 重命名得到目标列
df_merged.rename(columns={'value_new': 'new_value'}, inplace=True)

两种方案最终输出和你给出的预期结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:54:03