如何基于含重复值的列创建按另一列分组的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
相关产品推荐
相关产品推荐

