python pandas读入千万行(10GB)csv文件

3000万行的csv文件直接用普通的read_csv(‘XXX.csv’)读取会卡死,或者报超出内存的错误,一周的时间测试了几个方法,在这里总结一下

dask.dateframe

这个库基本实现了所有pandas.DateFrame的方法,
适用场景:对大型csv文件进行逐行处理、筛选等操作,或者分组求均值等极其合适,总之就是如果对大型数据进行一些简单操作并将其保存为小型数据集非常合适
但不适用于需要对数据集进行复杂操作的情况,因为这个库在读取数据的时候采用的是切片的方法,不会把它全量读到内存中去,如果想看数据的某一行需要使用compute()函数,这个函数非常耗时,不能频繁使用。
具体操作参考官方网页:https://docs.dask.org/en/stable/

pandas read_csv函数

主要用到read_csv的以下四个参数
dtype=,设置每列的数据类型
usecols=,只读取指定列
iterator=True,读取数据的迭代器
chunksize=10000 每次读取10000行
生成迭代器后,利用concat函数将csv读为dataframe
举例:

dtype = {'列1':str,'列2':'int16','列3':'str'}
need_cols = ['列1','列2']
df_iter = pd.read_csv('./XXX.csv',dtype=dtype, usecols=need_cols, iterator=True, chunksize=10000)
df = pd.concat([dfi for dfi in df_iter])

加速读取

如果csv文件会被频繁读入python,可以再第一次读取时采用read_csv的方法将csv文件读入后,将其保存为.pkl文件,后续再需要读取时就直接读pkl文件,读取速度会快很多

    try:
        df = pd.read_pickle('XXX.pkl')
        df.astype({'列1':str,'列2':'int16'})
    except (FileNotFoundError):
 		dtype = {'列1':str,'列2':'int16','列3':'str'}
		need_cols = ['列1','列2']
		df_iter = pd.read_csv('./XXX.csv',dtype=dtype, usecols=need_cols, iterator=True, chunksize=10000)
		df = pd.concat([dfi for dfi in df_iter]
        df.to_pickle('XXX.pkl')

读取包含3000多万行,30多列的pkl文件用时20秒

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值