Pandas DataFrame列顺序意外错乱问题排查咨询
问题原因及解决办法
原因分析
你遇到的列顺序混乱问题,核心出在用普通字典创建DataFrame时的列顺序不确定性:
- 在Python 3.7之前,普通字典是无序的,你编写字典时的键顺序不会被保留,创建出的
new_df_row列顺序会默认按键的ASCII码排序(比如#Contigs这类以#开头的键,ASCII码比字母开头的Assembly小,会排在前面)。 - 初始的空
stats_df虽然指定了列顺序,但第一次concat时,因为它是空的,Pandas会以第一个有数据的new_df_row的列顺序作为合并结果的列顺序,后续合并其他行时列顺序不会改变,最终就出现了和初始定义不符的列顺序。
解决办法
有几种简单的方式可以固定列顺序:
- 创建new_df_row时强制指定列顺序
在pd.DataFrame()中添加columns参数,明确列的排列顺序,和初始的stats_df保持一致:new_df_row = pd.DataFrame( {'Assembly':[assembly_name],'Size':[assembly_size_in_Mbp],'#Contigs':[num_of_contigs],'#Contigs > 3000':[greater_than_3000_count],'N50':[n50],'Longest_contig':[longest_contig]}, columns=['Assembly','Size','#Contigs','#Contigs > 3000','N50','Longest_contig'] ) - 最后统一调整列顺序
所有数据合并完成后,直接按目标顺序重新索引列:stats_df = stats_df[['Assembly','Size','#Contigs','#Contigs > 3000','N50','Longest_contig']] - 使用有序字典(适用于Python 3.7之前版本)
导入collections.OrderedDict来创建有序字典,确保键的顺序被保留:from collections import OrderedDict new_df_row = pd.DataFrame(OrderedDict([ ('Assembly', [assembly_name]), ('Size', [assembly_size_in_Mbp]), ('#Contigs', [num_of_contigs]), ('#Contigs > 3000', [greater_than_3000_count]), ('N50', [n50]), ('Longest_contig', [longest_contig]) ]))
内容的提问来源于stack exchange,提问作者Rainman
相关产品推荐
相关产品推荐

