Python Pandas不缩减原行数按条件聚合生成唯一值新列
实现方案
核心用Pandas的groupby.transform()方法实现,该方法会将分组聚合结果映射回原始行,不会缩减DataFrame行数。
完整代码
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({ 'Col1': ['SF', 'BF', 'QW', 'SF', 'QW', 'SF'], 'Col2': [123, 543, 241, 123, 789, 678], 'Col3': ['01/02', '30/12', '30/12', '01/02', '20/11', '31/12'], 'Col4': ['UP', 'DO', 'AF', 'WA', 'D', 'OT'] }) # 初始化目标列 df['目标列'] = '' # 处理Col1为SF的行:按Col2+Col3分组聚合Col4 sf_filter = df['Col1'] == 'SF' df.loc[sf_filter, '目标列'] = df[sf_filter].groupby(['Col2', 'Col3'])['Col4'].transform(lambda x: ', '.join(x)) # 处理Col1非SF的行:按Col3分组聚合Col4 non_sf_filter = df['Col1'] != 'SF' df.loc[non_sf_filter, '目标列'] = df[non_sf_filter].groupby('Col3')['Col4'].transform(lambda x: ', '.join(x)) print(df)
输出结果
| Col1 | Col2 | Col3 | Col4 | 目标列 |
|---|---|---|---|---|
| SF | 123 | 01/02 | UP | UP, WA |
| BF | 543 | 30/12 | DO | DO, AF |
| QW | 241 | 30/12 | AF | DO, AF |
| SF | 123 | 01/02 | WA | UP, WA |
| QW | 789 | 20/11 | D | D |
| SF | 678 | 31/12 | OT | OT |
逻辑说明
transform方法会保留原DataFrame的索引,分组聚合后的结果会自动匹配到组内的所有原始行,无需额外做表关联操作- 拆分两类行分别处理,完全匹配指定的分组规则
内容的提问来源于stack exchange,提问作者Frisk19
相关产品推荐
相关产品推荐

