使用Pandas转换CSV价格列时遭遇IntCastingNaNError错误求助
问题分析
错误pandas.errors.IntCastingNaNError: Cannot convert non-finite values (NA or inf) to integer的核心原因是Price列存在空值(NaN)、无穷值或非数值内容,和数据量无关。同时你的代码还有两处明显问题:
- 误将整个DataFrame传给
divide_by_7_5函数,而非目标列df["Price"] - 强制将含空值的列转为int类型——int类型无法存储NaN,必然触发报错
解决方案
步骤1:先清理Price列数据
先读取数据并排查、处理异常值:
import pandas as pd # 只读取Price列,避免加载冗余数据 data = pd.read_csv(r"products.csv", usecols=["Price"]) # 排查异常:查看空值数量 print("空值数量:", data["Price"].isna().sum()) # 排查非数值的行(如果Price是字符串格式) non_numeric_rows = data[pd.to_numeric(data["Price"], errors="coerce").isna()] print("非数值行:\n", non_numeric_rows) # 处理空值:二选一即可 # 方案1:删除含空值的行 data = data.dropna(subset=["Price"]) # 方案2:用中位数填充空值(适合不想丢数据的场景) # data["Price"] = data["Price"].fillna(data["Price"].median()) # 转换为数值类型(先转float,确保兼容空值;处理完空值后也可转int) data["Price"] = pd.to_numeric(data["Price"], errors="coerce")
步骤2:高效实现货币转换
不用写循环函数,Pandas原生支持向量运算,效率远高于Python循环:
# 直接对列做除法完成转换 data["Converted_Price"] = data["Price"] / 7.5 print(data.head())
如果一定要用自定义函数,需传入列的数值序列:
def divide_by_7_5(numbers): return numbers / 7.5 # 传入Price列的Series直接运算 result = divide_by_7_5(data["Price"]) print(result.head())
关键提醒
low_memory=False是解决大文件读取时的类型推断问题,和当前空值转int的报错无关,所以加了没用- 处理万级以上数据时,优先用Pandas原生操作,避免手动循环,性能差距会非常大
内容的提问来源于stack exchange,提问作者dac3d
相关产品推荐
相关产品推荐

