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

如何基于含重复值的列创建按另一列分组的Pandas透视表

当然有更优雅的解决方案!针对你的需求,Pandas提供了更简洁的方法来实现这个透视表,不需要拆分多个Series再合并。下面介绍两种推荐的方法:


方法1:使用pivot_table(最推荐)

pivot函数无法处理重复索引,但pivot_table就是为这种需要聚合重复分组的场景设计的。你可以直接为key2的不同取值指定对应的聚合函数,一步到位得到目标结果:

import pandas as pd

df = pd.DataFrame({'key1': ['id1','id1','id1','id1','id2','id2','id2','id3'],
                   'key2': ['MIN','MIN','MAX','MAX','MIN','MIN','MAX','MIN'],
                   'key3': [0,1,0,1,0,2,1,0],
                   'value': [-1,-2,11,12,-4,0,9,-2]})

pivot_result = df.pivot_table(
    index='key1',
    columns='key2',
    values='value',
    aggfunc={'MIN': 'min', 'MAX': 'max'}  # 为每个key2值匹配对应的聚合逻辑
)

print(pivot_result)

输出:

key2  MIN   MAX
key1           
id1   -2  12.0
id2   -4   9.0
id3   -2   NaN

这个方法不仅代码简洁,还具备很好的扩展性——如果key2后续新增其他取值(比如AVG),只需要在aggfunc字典里添加对应的聚合规则即可,不需要修改整体结构。


方法2:groupby + unstack组合

如果你更习惯用groupby的思路,也可以先按key1和key2分组,根据key2的值动态选择聚合函数,再通过unstack把key2从索引转为列:

# 定义key2到聚合函数的映射关系
agg_mapping = {'MIN': 'min', 'MAX': 'max'}

group_result = (
    df.groupby(['key1', 'key2'])['value']
      .agg(lambda x: getattr(x, agg_mapping[x.name[1]])())  # 根据key2调用对应聚合方法
      .unstack('key2')  # 将key2层级转为列
)

print(group_result)

这个方法同样能得到符合预期的结果,适合偏好groupby操作逻辑的场景。


对比你的原始方法

你拆分两个Series再合并的方式虽然可行,但存在两个明显的不足:

  • 冗余性:如果key2有更多取值,需要重复编写多个Series的分组逻辑;
  • 效率:多次分组和合并会增加不必要的计算开销,而上面的两种方法都是一次性完成分组与聚合。

两种推荐方法都能完美适配通用场景,代码更简洁易维护。

内容的提问来源于stack exchange,提问作者Giuseppe Marco Boscardin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 08:44:09