pandas sort_values排序CSV ATOMS_ID列异常及撤销排序咨询
pandas排序异常问题解决指南
问题表现
使用pandas.DataFrame.sort_values方法对CSV文件排序时,目标是按ATOMS_ID列数值升序排列,执行代码为:df.sort_values(["ATOMS_ID"],axis = 0, ascending = [True],inplace = True)
- 原始未排序CSV内容:

- 实际输出排序结果:

排序结果未按1、2、3…的数值顺序排列,而是呈现1、10、100…的排列规律。
异常原因
ATOMS_ID列读取CSV时被解析为字符串(object)类型,而非整数/浮点数值类型。字符串排序规则为逐字符比对ASCII码值,因此会出现"1" < "10" < "100" < "2"的排序结果,和数值大小排序逻辑不一致。
修复方法
排序前先将ATOMS_ID列转换为数值类型,再执行排序即可得到预期结果:
# 将目标列转为整数类型 df["ATOMS_ID"] = df["ATOMS_ID"].astype(int) # 执行排序 df.sort_values(["ATOMS_ID"], axis=0, ascending=True, inplace=True)
若读取CSV阶段就明确字段类型,也可以在调用pd.read_csv()时通过dtype参数指定ATOMS_ID列的类型为int,从源头避免类型解析错误。
排序后恢复原始数据顺序的方案
共三种常用可落地方案:
- 非原地修改保留原始数据:调用
sort_values时不设置inplace=True,将排序结果赋值给新变量,原始DataFrame不会做任何改动,随时可以调用。# 排序结果存入新变量,原df保持原始顺序不变 df_sorted = df.sort_values(["ATOMS_ID"], axis=0, ascending=True) - 排序前备份原始索引:如果需要做原地排序,可以在排序前先把原始索引存为一列,需要恢复时按该列排序即可。
# 排序前备份原始顺序 df["origin_order"] = df.index # 执行原地排序... # 恢复原始顺序 df.sort_values("origin_order", inplace=True) df.drop(columns="origin_order", inplace=True) - 按默认索引还原:如果排序后没有执行
reset_index()重置索引,直接按索引升序排列即可回到原始顺序。df.sort_index(inplace=True)
内容的提问来源于stack exchange,提问作者Shivank Chadda
相关产品推荐
相关产品推荐

