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

如何访问pivot_table生成的MultiIndex DataFrame列并修改列名

问题描述

我有如下原始DataFrame:

import pandas as pd

df = pd.DataFrame({'slide': [0, 0, 1, 1, 2, 2, 0, 0],
                   'time': [1673, 17892, 1132, 61730, 2323, 8491, 3958, 3432],
                   'frame': ['-1', '0', '-1', '0', '-1', '0', '-1', '0'],
                   'id': [1111, 1111, 1132, 1132, 4636, 4636, 7711, 7711],
                   'name': ['foo', 'foo', 'bar', 'bar', 'zoo', 'zoo', 'baz', 'baz']})

输出结果:

slide   time frame    id name
0      0   1673    -1  1111  foo
1      0  17892     0  1111  foo
2      1   1132    -1  1132  bar
3      1  61730     0  1132  bar
4      2   2323    -1  4636  zoo
5      2   8491     0  4636  zoo
6      0   3958    -1  7711  baz
7      0   3432     0  7711  baz

执行透视表操作:

pivoted_df = pd.pivot_table(df, index=['id','name'], values='time', columns=['frame']).astype(int)

得到结果:

frame        -1      0
id   name             
1111 foo   1673  17892
1132 bar   1132  61730
4636 zoo   2323   8491
7711 baz   3958   3432

我希望将结果调整为以下格式:

id   name    ON    OFF    
1111 foo   1673  17892
1132 bar   1132  61730
4636 zoo   2323   8491
7711 baz   3958   3432

作为Pandas新手,刚了解MultiIndex,尝试用df['0']['id']和df['0','id']访问列均报错,求解决方法。


解决方案

方法一:透视后重命名列

先执行透视操作,再对列名进行替换,同时可以去掉列索引的名称(即顶部的frame):

# 执行透视并转换数据类型
pivoted_df = pd.pivot_table(df, index=['id','name'], values='time', columns=['frame']).astype(int)
# 将原列名'-1'、'0'替换为'ON'、'OFF'
pivoted_df = pivoted_df.rename(columns={'-1': 'ON', '0': 'OFF'})
# 移除列索引的名称(可选,若不需要顶部的"frame"标签则执行)
pivoted_df.columns.name = None

方法二:先替换列值再透视

先对原始DataFrame的frame列做值映射,再执行透视,直接得到目标列名:

# 替换frame列的取值
df['frame'] = df['frame'].map({'-1': 'ON', '0': 'OFF'})
# 执行透视操作
pivoted_df = pd.pivot_table(df, index=['id','name'], values='time', columns=['frame']).astype(int)
# 移除列索引名称(可选)
pivoted_df.columns.name = None

关于MultiIndex访问的误区

你之前的访问方式错误,原因是:

  • id和name是行级的MultiIndex,不是列;'-1'和'0'才是透视后的列名。
  • 正确的访问方式示例:
    • 访问单列:pivoted_df['-1'] 或 pivoted_df.loc[:, '-1']
    • 访问指定行:比如获取id=1111且name=foo的所有数据,用pivoted_df.loc[(1111, 'foo'), :]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:45:24