使用pandas read_csv时默认int8,指定第4000列为int32的方法
解决方案:精确指定列类型的字典配置
当然可以实现!这正是pandas.read_csv中dtype参数的实用场景——你可以通过字典给个别列单独设置类型,其余列统一用你想要的默认类型,完美适配你这个大文件的需求。
具体实现步骤
因为你的文件有4000列(header=None意味着列索引从0开始,所以第4000列对应的索引是3999),我们可以先构建一个类型字典,把所有列默认设为np.int8,再单独覆盖最后一列的类型为np.int32:
import pandas as pd import numpy as np # 构建类型字典:所有列默认int8,最后一列设为int32 dtype_config = {col: np.int8 for col in range(4000)} dtype_config[3999] = np.int32 # 第4000列(索引3999)用int32 # 读取大文件 df = pd.read_csv( 'file.dat', sep=',', engine='c', header=None, na_filter=False, dtype=dtype_config, low_memory=False )
更灵活的写法(适配列数变化)
如果之后你的文件列数可能变动,不想手动写4000,可以先读取一行获取总列数,再动态生成字典:
import pandas as pd import numpy as np # 先读取第一行获取总列数(几乎不占内存) total_columns = pd.read_csv('file.dat', sep=',', header=None, nrows=1).shape[1] # 动态生成类型字典 dtype_config = {col: np.int8 for col in range(total_columns)} dtype_config[total_columns - 1] = np.int32 # 最后一列 # 读取完整文件 df = pd.read_csv( 'file.dat', sep=',', engine='c', header=None, na_filter=False, dtype=dtype_config, low_memory=False )
为什么这么做?
对于10GB的大型CSV,这种在读取阶段就精准指定类型的方式能帮你节省大量内存——int8只占1字节,而int32占4字节,大部分列用int8能把内存占用控制在最低,同时保证最后一列的数值精度。你原来用的engine='c'、na_filter=False、low_memory=False这些优化参数都可以保留,它们能进一步提升大文件的读取速度。
内容的提问来源于stack exchange,提问作者TLD
相关产品推荐
相关产品推荐

