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

