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

