使用Pandas读取CSV遇NaN引发ValueError的通用解决方法咨询
解决Pandas读取CSV时整数列含NaN的ValueError问题
这个错误的核心原因是:Pandas原生的int类型不支持存储NaN值,当指定某列为int类型但该列存在缺失值时,就会触发ValueError。以下是几种标准化的解决方法,适配不同场景:
1. 用可空整数类型替代普通int
Pandas提供了可空整数类型Int64(注意大写I),专门用于存储含缺失值的整数数据。直接修改你dtypes字典里的类型定义即可:
def read_csv_file(filename): dtypes = { 'transaction': 'Int64', 'kev': 'Int64', 'companyName': str, 'companyOwner': str, 'companyCountry': str, } data = pd.read_csv(filename, dtype=dtypes, na_values={'tradedate': -1}) return data.to_dict('records')
这种方法适合你明确知道哪些列是整数类型,但不确定是否存在缺失值的场景。
2. 让Pandas自动推断可空类型(推荐用于未知列场景)
如果你无法预知哪些列会出现NaN或数据类型,可以借助Pandas的自动类型推断能力,直接让它识别并使用可空类型:
def read_csv_file(filename): # Pandas 2.0+ 版本可用,自动推断所有列的可空类型 data = pd.read_csv(filename, dtype_backend='numpy_nullable', na_values={'tradedate': -1}) # 若使用旧版本Pandas,可尝试pyarrow引擎实现自动推断 # data = pd.read_csv(filename, engine='pyarrow', na_values={'tradedate': -1}) return data.to_dict('records')
该方法无需手动维护dtypes字典,Pandas会自动为含缺失值的整数列分配Int64类型,字符串列也会转为可空的String类型,完美适配未知列的场景。
3. 先读为object类型再自动转换(兼容旧版Pandas)
如果你的Pandas版本低于1.0(不支持可空类型),可以先将所有列读取为object类型,再通过内置方法自动转换为合适的类型:
def read_csv_file(filename): # 先以object类型读取所有列,避免类型错误 data = pd.read_csv(filename, dtype=object, na_values={'tradedate': -1}) # 自动转换为最优可空类型 data = data.convert_dtypes() return data.to_dict('records')
convert_dtypes()会自动识别列的真实类型,将含NaN的整数列转为Int64,字符串列转为String,同时保留其他列的正确类型。
内容的提问来源于stack exchange,提问作者Julián Oviedo
相关产品推荐
相关产品推荐

