读取CSV文件遇DtypeWarning,指定列被移除的问题求助
我来帮你搞定这个头疼的问题!你遇到的DtypeWarning是因为Pandas自动推断列类型时,发现15、16、18、24列里同时存在不同数据类型(比如字符串和数字混在一起),而列被移除大概率是因为列名列表columns和CSV实际的列数不匹配,或者读取时的参数设置出了问题。下面给你几个针对性的解决方案:
第一步:先排查列名和CSV列数是否匹配
很多时候列丢失是因为你定义的columns列表长度和CSV实际的列数不一致。比如CSV有25列,但columns只定义了21列,后面的列就会被直接丢弃。你可以先不指定names参数,读取前几行看看实际列数:temp_df = pd.read_csv('inventory-new.csv', sep=";", nrows=5) print("实际列数:", temp_df.shape[1]) print("你定义的columns长度:", len(columns))如果长度不匹配,赶紧调整
columns列表,确保每一列都有对应的列名。第二步:精确指定问题列的类型+关闭分块推断
全局设置dtype=object有时候可能因为Pandas的分块读取机制(默认low_memory=True)导致不生效,你可以单独指定这几个问题列的类型,同时关闭分块推断:# 只给有问题的列指定object类型,其他列正常推断 dtype_map = {15: object, 16: object, 18: object, 24: object} inventory = pd.read_csv( 'inventory-new.csv', sep=";", names=columns, dtype=dtype_map, low_memory=False )low_memory=False会让Pandas一次性读取整个文件来推断类型,避免分块读取时出现的类型冲突警告。第三步:用converters灵活处理混合类型
如果上面的方法还是不行,试试用converters参数给问题列自定义转换逻辑,这样既能保留所有数据,又能处理混合类型:def handle_mixed_types(value): # 尝试转成数字,失败就保留原始字符串 try: return pd.to_numeric(value) except ValueError: return str(value) # 指定需要处理的列 converter_map = { 15: handle_mixed_types, 16: handle_mixed_types, 18: handle_mixed_types, 24: handle_mixed_types } inventory = pd.read_csv( 'inventory-new.csv', sep=";", names=columns, converters=converter_map, low_memory=False )第四步:检查CSV文件格式
有时候列丢失可能是因为CSV里某些行的分隔符(分号)数量不一致,导致列错位。你可以用文本编辑器打开CSV文件,看看第15、16、18、24列所在的行是否有格式异常,比如多余的分号或者缺失的字段。
按照这个步骤排查下来,应该能解决你的问题!
内容的提问来源于stack exchange,提问作者Raj Kumar

