如何重组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
相关产品推荐
相关产品推荐

