Pandas DataFrame列排列异常,如何取消默认排序调整自定义列顺序
问题原因
列顺序异常确实是pandas默认排序机制导致的:
groupby方法默认sort=True,会对所有分组键按字典序排序。年龄分段字符串56-65 years的首字母排序优先级低于Gender、SEC字段的取值首字母,因此unstack生成多级列之后,该列会被排到所有列的末尾。
解决方案
方案1:关闭groupby默认排序
如果只需要保留原始数据中取值的出现顺序,直接在groupby参数中添加sort=False即可,修改后代码如下:
cols=['Gender','QAge_Post','SEC'] q2=(nb.melt(id_vars='Center_Name',value_vars=cols) .groupby([pd.Grouper(key='Center_Name'),'variable','value'], sort=False) # 新增sort=False参数 .size() .unstack(level=[1,2],fill_value=0)) # 先排好列再插入汇总列,避免Total被后续操作打乱 q2.insert(0, 'Total', q2['Gender'].sum(axis=1)) q2.to_excel('Basic.xlsx')
方案2:手动指定列顺序(更稳定,推荐)
如果需要严格固定各字段取值的顺序(比如年龄分段必须按从小到大排列),可以手动定义顺序后重索引列,不受原始数据顺序影响:
cols=['Gender','QAge_Post','SEC'] q2=(nb.melt(id_vars='Center_Name',value_vars=cols) .groupby([pd.Grouper(key='Center_Name'),'variable','value']) .size() .unstack(level=[1,2],fill_value=0)) # 自定义各字段的取值顺序,按你实际的取值调整即可 order_config = { 'Gender': ['男', '女'], 'QAge_Post': ['18-25 years', '26-35 years', '36-45 years', '46-55 years', '56-65 years', '65+ years'], 'SEC': ['A', 'B', 'C', 'D', 'E'] } # 生成按要求排序的列名列表 sorted_cols = [] for var in cols: for val in order_config[var]: if (var, val) in q2.columns: sorted_cols.append((var, val)) # 重排列 q2 = q2.reindex(columns=sorted_cols) # 插入汇总列 q2.insert(0, 'Total', q2['Gender'].sum(axis=1)) q2.to_excel('Basic.xlsx')
内容的提问来源于stack exchange,提问作者Benjamin Roy
相关产品推荐
相关产品推荐

