字典列表转Pandas DataFrame列顺序不符,如何解决?
解决DataFrame列顺序与字典列表定义不一致的问题
先还原下你的场景:你通过for循环生成了一个指定键顺序的字典列表,转成DataFrame后却发现列顺序乱了,不是你定义的Plo、Ots、Gts、Mts、Frts、Fin这个顺序。我先把你的代码补全下(原代码里有个小细节的分支缺失,帮你补上了):
isv = [] for obj in hearts: rawvalue = obj.raw - readvalue if rawvalue < 0: rawvalue = rawvalue + 440 # 补充else分支,让rawvalue保持原值 else: rawvalue = rawvalue obj = str(obj) obj = obj.strip('<').split(" ")[0] isv.append({ 'Plo': obj, 'Ots': viewdata(rawvalue)[0][3], 'Gts': viewdata(rawvalue)[0][0], 'Mts': viewdata(rawvalue)[0][1], 'Frts': viewdata(rawvalue)[0][2], 'Fin': rawvalue }) # 转成DataFrame pdadata = pd.DataFrame(isv)
为什么会出现列顺序不对的情况?
虽然Python 3.7及以后版本已经把字典的插入顺序作为官方特性保留,但pandas在处理字典列表生成DataFrame时,偶尔会因为内部兼容逻辑导致列顺序和预期不符。所以最稳妥的方式是显式指定列顺序,不要依赖默认行为。
解决方案
这里给你两种最常用的方法:
方法1:生成DataFrame时直接指定列顺序
这是最高效的方式,创建DataFrame的同时就传入你想要的列顺序:
# 先定义好目标列顺序 column_order = ['Plo', 'Ots', 'Gts', 'Mts', 'Frts', 'Fin'] # 创建时指定columns参数 pdadata = pd.DataFrame(isv, columns=column_order)
这样生成的DataFrame会严格按照你定义的顺序排列列,一步到位。
方法2:生成DataFrame后调整列顺序
如果你已经生成了DataFrame,也可以用下面两种方式快速调整:
column_order = ['Plo', 'Ots', 'Gts', 'Mts', 'Frts', 'Fin'] # 方式A:用reindex方法 pdadata = pdadata.reindex(columns=column_order) # 方式B:直接索引选择(更简洁) pdadata = pdadata[column_order]
这两种方式效果完全一致,选你顺手的就行。
验证效果
用你给出的样本数据,调整后DataFrame的列顺序就会和你期望的一致:
Plo Ots Gts Mts Frts Fin 0 1 Parcel Red Blue Yellow 678.5470 1 2 Gift Green purple Black 876.2140 2 3 Order Green purple Black 877.2170 3 4 Base Green purple Black 922.1450 4 5 Flat Green purple Black 964.2000 5 6 Deal Green purple Black 400.0000 6 7 Mission Green purple Black 450.1240 7 8 Base Green purple Black 520.2145 8 9 Flat Green purple Black 570.1450 9 10 Deal Green purple Black 600.1780
内容的提问来源于stack exchange,提问作者Python_newbie
相关产品推荐
相关产品推荐

