Python Pandas如何在不进行聚合的前提下实现行转列操作?
问题原因
你使用pivot_table时,同一[timestamp, id, color]组合下存在多条记录,pivot_table默认会对数值列执行均值聚合,所以得到了聚合后的结果而非原始值。
解决方案
先给同一分组下的每条记录增加唯一序号标识,保证透视时的列组合唯一,即可避免聚合,完整实现代码如下:
import pandas as pd # 原始数据 data = { 'timestamp': ['2021-01-01', '2021-01-01', '2021-01-01', '2021-01-01', '2021-01-01', '2021-01-01'], 'id': [1000, 1000, 1000, 1000, 1000, 1000], 'color': ['Blue', 'Blue', 'Blue', 'Pink', 'Pink', 'Pink'], 'a': [4598, 1479, 3547, 9811, 8746, 9856], 'b': [1, 2, 3, 4, 5, 6], 'c': [0.45, 0.89, 0.65, 0.06, 0.96, 0.46] } df = pd.DataFrame(data) # 新增分组内序号列,标记同color下的第N条记录 df['seq'] = df.groupby(['timestamp', 'id', 'color']).cumcount() # 执行透视,无重复组合不会触发聚合 res = df.pivot( index=['timestamp', 'id'], columns=['color', 'seq'], values=['a', 'b', 'c'] ) # 调整列层级顺序,将color放到最上层,匹配预期结构 res = res.swaplevel(0, 1, axis=1).sort_index(axis=1, level=0) # 可选:删除列名中的seq层级,不需要展示序号可执行 res.columns = res.columns.droplevel(1) # 可选:重置索引,将timestamp、id从索引转回普通列 res = res.reset_index()
核心逻辑
新增的seq列给同一[timestamp, id, color]分组下的每条记录赋予了唯一标识,透视时每个组合唯一,不存在重复记录需要聚合,因此可以保留所有原始值。
内容的提问来源于stack exchange,提问作者mrsnice
相关产品推荐
相关产品推荐

