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

Python pandas按条件分组聚合生成去重拼接列并写入原DataFrame的方法

实现pandas按条件分组聚合结果回写原表的方案

首先你原代码中存在列名大小写不一致的问题:筛选时写的是col1(小写),实际列名是Col1(首字母大写),这是导致匹配、merge失败的常见原因,修正后可以用以下两种方案实现需求:

方案1:字典映射法(逻辑简单,无需多表合并)

先分别生成两种规则的映射字典,再按行条件赋值:

# 生成非SF场景的映射表:key为Col2值,value为拼接结果
non_sf_map = df[df['Col1']!='SF'].groupby('Col2')['Col3'].agg(
    lambda x: ','.join(x.astype(str).unique())
).to_dict()

# 生成SF场景的映射表:key为(Col2, Col5)元组,value为拼接结果
sf_map = df[df['Col1']=='SF'].groupby(['Col2','Col5'])['Col3'].agg(
    lambda x: ','.join(x.astype(str))
).to_dict()

# 初始化目标列
df['Col4'] = ''
# 赋值非SF行
df.loc[df['Col1']!='SF', 'Col4'] = df.loc[df['Col1']!='SF', 'Col2'].map(non_sf_map)
# 赋值SF行
df.loc[df['Col1']=='SF', 'Col4'] = df.loc[df['Col1']=='SF', ['Col2','Col5']].apply(tuple, axis=1).map(sf_map)

代码中加了astype(str)是为了兼容Col3为数值类型的场景,如果Col3本身是字符串可以去掉。

方案2:merge合并法

如果习惯用merge实现,注意聚合时先重命名目标列,再分条件合并:

# 聚合非SF数据,重命名结果列为Col4
non_sf_agg = df[df['Col1']!='SF'].groupby('Col2', as_index=False).agg(
    Col4=('Col3', lambda x: ','.join(x.astype(str).unique()))
)
# 聚合SF数据,重命名结果列为Col4
sf_agg = df[df['Col1']=='SF'].groupby(['Col2','Col5'], as_index=False).agg(
    Col4=('Col3', lambda x: ','.join(x.astype(str)))
)

# 两次左连接合并到原表
df = df.merge(non_sf_agg, on='Col2', how='left')\
       .merge(sf_agg, on=['Col2','Col5'], how='left', suffixes=('', '_sf'))

# 按条件合并两个Col4结果,删除临时列
df['Col4'] = df['Col4'].where(df['Col1']!='SF', df['Col4_sf'])
df = df.drop(columns=['Col4_sf'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:18:03