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

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为对应均值列表的结果,分两步操作:

  1. 先按Col1、Col2、Col4三级分组,计算每个Col4分组下Col5的均值,同时收集对应的Col3值
  2. 再按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 21:20:16