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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:06:04