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

如何重组Pandas DataFrame:将segment列转为表头

Pandas DataFrame 重组:将列值转为表头

我有如下结构的Pandas DataFrame(实际行数更多):

segment  time concentration
0        1   1.0         data1
1        2   1.0         data2
2        3   1.0         data3
3        1   2.0         data4
4        2   2.0         data5
5        3   2.0         data6
6        1   3.0         data7
7        2   3.0         data8
8        3   3.0         data9

我希望将其重组,把segment列的值作为新的表头(time可作为索引或保留列),得到如下目标结构:

time      1      2      3
0   1.0  data1  data2  data3
1   2.0  data4  data5  data6
2   3.0  data7  data8  data9

我曾考虑用字典实现,但不确定具体操作方式;也查阅了pd.melt()方法,不过找到的案例都是反向操作,不清楚该方法是否适用及如何实现。

以下是用于复现的代码:

import pandas as pd

df = pd.DataFrame([[1,1.0,'data1'],  [2,1.0,'data2'], [3,1.0,'data3'],
                   [1,2.0,'data4'],  [2,2.0,'data5'], [3,2.0,'data6'],
                   [1,3.0,'data7'],  [2,3.0,'data8'], [3,3.0,'data9'],
                   ],
                  columns = ['segment','time','concentration'])

df_target = pd.DataFrame([[1.0,'data1','data2','data3'],
                          [2.0,'data4','data5','data6'],
                          [3.0,'data7','data8','data9'],
                          ],
                         columns = ['time',1,2,3])

解决方案:使用pivot方法

你需要的是长表转宽表操作,pd.melt()是宽表转长表的反向操作,这里直接用pivot()方法即可实现需求:

方法1:保留time作为普通列

df_result = df.pivot(index='time', columns='segment', values='concentration').reset_index()
# 移除列名的层级标记
df_result.columns.name = None

运行后得到的结果与df_target完全一致:

time      1      2      3
0   1.0  data1  data2  data3
1   2.0  data4  data5  data6
2   3.0  data7  data8  data9

方法2:将time设为索引

如果不需要把time保留为普通列,可省略reset_index():

df_result = df.pivot(index='time', columns='segment', values='concentration')
df_result.columns.name = None

结果结构如下:

1      2      3
time                     
1.0   data1  data2  data3
2.0   data4  data5  data6
3.0   data7  data8  data9

特殊情况处理

如果实际数据中存在同一time+segment组合的重复行,pivot()会报错,此时可以用pivot_table()并指定聚合函数(比如取第一个值):

df_result = df.pivot_table(index='time', columns='segment', values='concentration', aggfunc='first').reset_index()
df_result.columns.name = None

内容的提问来源于stack exchange,提问作者gram_schmidt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 14:02:45