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

