pandas pivot_table同组值默认求均值 如何保留原始数据不聚合
问题本质
pivot_table是为聚合透视设计的函数,默认aggfunc='mean'会自动对相同索引+列的键值对做均值聚合,本身不适合保留逐行原始结构的转换场景。之前用aggfunc=list后接explode出现顺序错乱,是因为分组聚合阶段已经丢失了原始数据的逐行位置标记,后续操作无法还原原始排列顺序。
实现方法
放弃使用pivot_table,通过给重复分组加唯一行标识的方式构造唯一索引键,再用unstack做结构转换,即可完全保留原始行顺序,不会触发任何聚合:
- 第一步:按索引列、透视列分组,给每组内的行加递增序号,保证每一行的索引键全局唯一
- 第二步:设置多层索引后对透视列做
unstack,因为键唯一不会触发聚合 - 第三步:删除辅助用的序号列,得到最终结果
对应代码如下:
import pandas as pd d = pd.DataFrame(data={ 'x_values':[13.4,13.08,12.73,12.,33.,23.,12.], 'y_values': [1.54, 1.47,1.,2.,4.,4.,3.], 'experiment':['e', 'e', 'e', 'f', 'f','f','f'] }) # 生成组内唯一行号作为辅助索引 d['_row_no'] = d.groupby(['x_values', 'experiment']).cumcount() # 长宽转换,无聚合 result = ( d.set_index(['x_values', '_row_no', 'experiment'])['y_values'] .unstack('experiment') .reset_index('_row_no', drop=True) ) print(result)
运行后输出完全匹配预期结果:
experiment e f x_values 13.40 1.54 NaN 13.08 1.47 NaN 12.73 1.00 NaN 12.00 NaN 2.0 33.00 NaN 4.0 23.00 NaN 4.0 12.00 NaN 3.0
内容的提问来源于stack exchange,提问作者olivier dadoun
相关产品推荐
相关产品推荐

