You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何同一文件的xlsx与csv版本经pandas排序后输出不同?

问题分析与解决方法

核心原因:隐性数据差异导致排序结果不同

虽然打印显示数据内容一致,但pandas.read_excel和pandas.read_csv的默认解析逻辑存在差异,会产生以下隐性区别,进而影响排序:

  • 列数据类型不匹配:比如register列在xlsx中被解析为数值类型,csv中却被解析为字符串;或者索引为1的列类型不一致。字符串排序与数值排序规则完全不同(例如字符串"10"会排在"2"前面,数值则相反)。
  • 缺失值形式不同:xlsx的空单元格会被解析为NaN,而csv的空值可能被解析为空字符串''。排序时NaN和空字符串的优先级不同(默认NaN在排序末尾,空字符串在字符串排序中会排在前面)。
  • 浮点精度差异:若列为数值类型,xlsx读取的数值可能存在微小精度误差(如0.1在xlsx中存储为0.1000000000001),打印时无法察觉,但会影响排序顺序。

验证方法

  1. 检查列数据类型:
print("Excel读取的列类型:")
print(fields_df.dtypes)
print("\nCSV读取的列类型:")
print(fields_df1.dtypes)
  1. 检查缺失值情况:
# 检查NaN数量
print(fields_df[['register', fields_df.columns[1]]].isna().sum())
print(fields_df1[['register', fields_df1.columns[1]]].isna().sum())
# 检查空字符串数量
print((fields_df[fields_df.columns[1]] == '').sum())
print((fields_df1[fields_df1.columns[1]] == '').sum())
  1. 检查数值精度差异:
# 针对数值列,计算两DataFrame的差值
num_col = fields_df.columns[1]
diff = fields_df[num_col] - fields_df1[num_col]
print("数值差异行:")
print(diff[diff != 0])

解决步骤

  1. 统一列数据类型:
    读取时直接指定类型,或读取后转换:
# 方法1:读取CSV时指定类型(根据实际列类型调整)
fields_df1 = pd.read_csv('your_file.csv', dtype={'register': str, 1: int})

# 方法2:读取后统一转换类型
fields_df['register'] = fields_df['register'].astype(str)
fields_df1['register'] = fields_df1['register'].astype(str)
# 转换索引1的列类型(示例为整数,根据实际调整)
target_col = fields_df.columns[1]
fields_df[target_col] = fields_df[target_col].astype(int)
fields_df1[target_col] = fields_df1[target_col].astype(int)
  1. 统一缺失值处理:
    将CSV中的空字符串转为NaN,与Excel读取结果对齐:
import numpy as np
fields_df1 = fields_df1.replace('', np.nan)
  1. 处理浮点精度问题:
    对数值列进行四舍五入,统一精度:
target_col = fields_df.columns[1]
fields_df[target_col] = fields_df[target_col].round(6)
fields_df1[target_col] = fields_df1[target_col].round(6)

完成以上步骤后,再执行排序代码,结果即可保持一致。

内容的提问来源于stack exchange,提问作者utk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 21:35:15