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

如何修复pivot_table操作后的列顺序问题

解决pivot_table后bit列数字顺序错乱的问题

问题本质是pivot_table后列默认按字符串字典序排列,bit_10作为字符串比bit_9小,所以会排在前面。下面提供两种实用的修复方法:

方法1:pivot前将bit列转为有序类别列

先从bit字段中提取数字并转为整数,以此为依据给bit列设置有序类别,让pivot时遵循数字升序而非字符串顺序:

import pandas as pd

calc1 = pd.DataFrame({
    'byte': ['D0']*2 + ['D1']*2,
    'bit' : [f'bit_{i}' for i in range(7, 11)],
    'count': ['a', 'b', 'c', 'd']
})

# 提取bit中的数字部分,转为整数
calc1['bit_num'] = calc1['bit'].str.extract(r'bit_(\d+)').astype(int)
# 将bit列转为有序类别,顺序按bit_num升序排列
calc1['bit'] = pd.Categorical(
    calc1['bit'],
    categories=calc1.sort_values('bit_num')['bit'].unique(),
    ordered=True
)

# 执行pivot_table
result = calc1.pivot_table(
    index=calc1.index,
    columns=['byte', 'bit'],
    values='count',
    aggfunc=lambda x:' '.join(x)
)
print(result)

输出结果:

byte    D0           D1
bit  bit_7 bit_8 bit_9 bit_10
0        a   NaN   NaN    NaN
1      NaN     b   NaN    NaN
2      NaN   NaN     c    NaN
3      NaN   NaN   NaN      d

方法2:pivot后重新排序多层列

如果不想修改原DataFrame,可以在pivot完成后,针对多层列的bit层级提取数字,重新排序列:

import pandas as pd

calc1 = pd.DataFrame({
    'byte': ['D0']*2 + ['D1']*2,
    'bit' : [f'bit_{i}' for i in range(7, 11)],
    'count': ['a', 'b', 'c', 'd']
})

# 先执行pivot_table
result = calc1.pivot_table(
    index=calc1.index,
    columns=['byte', 'bit'],
    values='count',
    aggfunc=lambda x:' '.join(x)
)

# 按byte分组,每组内按bit的数字升序排序列
sorted_cols = result.columns.sort_values(
    key=lambda col: (col[0], int(col[1].split('_')[1]))
)
# 重新索引列得到正确顺序
result = result.reindex(columns=sorted_cols)
print(result)

该方法同样会输出顺序正确的结果。

内容的提问来源于stack exchange,提问作者fabio-dc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:43:29