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

