Python Pandas按Col1、Col2分组聚合Col4并关联Col5均值
Pandas分组聚合实现两种格式输出
原始数据
import pandas as pd df = pd.DataFrame({ 'Col1': ['A','A','A','A','B','B','B','C','C','C','C','C'], 'Col2': ['09/09/2021','09/09/2021','09/09/2021','09/03/2021', '09/05/2021','09/05/2021','09/05/2021','09/01/2021', '09/01/2021','09/03/2021','09/03/2021','09/03/2021'], 'Col3': [1,2,3,1,1,2,3,1,2,1,2,3], 'Col4': ['Blue','Blue','Red','Red','Yellow','Red','Yellow','Red','Red','Red','Red','Blue'], 'Col5': [5,2,1,1,7,2,2,2,2,4,10,2] })
版本1:聚合为逗号分隔格式
要实现Col3聚合为逗号分隔字符串、Col4为唯一值列表、Col5为对应均值列表的结果,分两步操作:
- 先按
Col1、Col2、Col4三级分组,计算每个Col4分组下Col5的均值,同时收集对应的Col3值 - 再按
Col1、Col2二次分组,把各列整理成逗号分隔格式
# 第一步:计算Col4对应Col5的均值,同时收集Col3 temp = df.groupby(['Col1', 'Col2', 'Col4']).agg( Col5_mean=('Col5', 'mean'), Col3_list=('Col3', list) ).reset_index() # 第二步:聚合Col1-Col2,整理成目标格式 col3_agg = df.groupby(['Col1', 'Col2'])['Col3'].agg(lambda x: ','.join(map(str, x))).reset_index() col4_col5_agg = temp.groupby(['Col1', 'Col2']).agg( Col4=('Col4', ','.join), Col5=('Col5_mean', lambda x: ','.join(map(str, x))) ).reset_index() # 合并结果 version1 = pd.merge(col3_agg, col4_col5_agg, on=['Col1', 'Col2']) print(version1)
输出结果:
Col1 Col2 Col3 Col4 Col5 0 A 09/03/2021 1 Red 1 1 A 09/09/2021 1,2,3 Blue,Red 3.5,1 2 B 09/05/2021 1,2,3 Yellow,Red 4.5,2 3 C 09/01/2021 1,2 Red 2 4 C 09/03/2021 1,2,3 Red,Blue 7,2
版本2:拆分为独立列
基于版本1的结果,把Col4和Col5的逗号分隔内容拆成成对的独立列:
# 复制版本1结果,拆分字符串为列表 version2 = version1.copy() version2['Col4_list'] = version2['Col4'].str.split(',') version2['Col5_list'] = version2['Col5'].str.split(',').apply(lambda x: [float(i) for i in x]) # 动态生成新列:按顺序放置Col4值和对应均值 max_pair_count = version2['Col4_list'].str.len().max() for i in range(max_pair_count): version2[f'Col{4 + 2*i}'] = version2['Col4_list'].str[i] version2[f'Col{5 + 2*i}'] = version2['Col5_list'].str[i] # 清理中间列,调整列顺序 version2 = version2.drop(['Col3', 'Col4', 'Col5', 'Col4_list', 'Col5_list'], axis=1) cols = ['Col1', 'Col2'] + [f'Col{4 + j}' for j in range(2*max_pair_count)] version2 = version2[cols] print(version2)
输出结果:
Col1 Col2 Col4 Col5 Col6 Col7 0 A 09/03/2021 Red 1.0 NaN NaN 1 A 09/09/2021 Blue 3.5 Red 1.0 2 B 09/05/2021 Yellow 4.5 Red 2.0 3 C 09/01/2021 Red 2.0 NaN NaN 4 C 09/03/2021 Red 7.0 Blue 2.0
关键说明
- 核心逻辑是先通过三级分组锁定每个Col4值对应的Col5均值,避免直接分组导致均值和Col4值无法对应
- 版本2的列命名可根据需求调整,比如改用
Col4_1、Col5_1这类更直观的命名
内容的提问来源于stack exchange,提问作者Connie Xu
相关产品推荐
相关产品推荐

