使用 pandas 分块处理大文件
使用 pandas 分块处理大文件
问题:今天在处理系统导出的 70 万行数据。打开文件进行读取时因超过默认读取上限导致流程出错,如果要处理不知得多费劲。
解决:我翻了一下文档,这一类读取文件的函数有两个参数:chunksize,iterator
原理就是不一次性把文件数据读入内存中,而是分多次。
1,指定 CHUNKSIZE 分块读取文件
read_csv 和 read_table 有一个 chunksize 参数,用以指定一个块大小(每次读取多少行),返回一个可迭代的 TextFileReader 对象。
table=pd.read_table(path+'kuaishou.txt',sep='\t',chunksize=1000000)
for df in table:
对df处理
#如df.drop(columns=['page','video_id'],axis=1,inplace=True)
#print(type(df),df.shape)打印看一下信息
我这里又对文件进行了划分,分成若干个子文件分别处理(没错,to_csv 也同样有 CHUNKSIZE 参数)
2,指定迭代 = 真
iterator=True 报道查看同样的的英文 TextFileReader 对象
reader = pd.read_table('tmp.sv', sep='\t', iterator=True)
df=reader.get_chunk(10000)
#通过get_chunk(size),返回一个size行的块
#接着同样可以对df处理
读取大文件其他优化参考
1. 读取限定列
一个 CSV 文件中,往往有很多不同的列,而我们通常只关注其中的某些列,如果把每行都读取出来,再提取信息,显然会增加 IO 量,因此我们可以在读文件的时候,定给 read_csv() 方法的参数,从而提高效率。
file = pd.read_csv('demo.csv',usecols=['column1', 'column2', 'column3'])
在 usecols 参数中,给定了要读取的 3 列,文件中则只包含这 3 列的信息。
2. 读取限定行
实际写代码的过程中,往往需要先跑一部分数据进行测试,测试通过后,再处理所有的数据。也可能我们仅仅需要一部分数据进行运算。时候这就可以使用 read_csv() 方法中的 nrows 参数,设定读取的行数。
file = pd.read_csv('demo.csv',nrows=1000,usecols=['column1', 'column2', 'column3'])
仅读取前 1000 行数据。
3. 分块读取
read_csv() 方法中还有一个参数,chunksize 可以指定一个 CHUNKSIZE 分块大小来读取文件。与直接使用 DF 进行遍历不同的是,查看报道的它英文的一个 TextFileReader 类型的对象。
reader = pd.read_csv('demo.csv',nrows=10000,
usecols=['column1','column2','column3'],
chunksize=1000,iterator=True)
reader
输出:
<pandas.io.parsers.TextFileReader at 0x120d2f290>
4. 其他
头()和尾部()
拿到一个很大的 CSV 文件后,为了看清文件的格式,可以使用该方法,先查看前 10 条数据。头()方法默认是 10 条,也可以用尾()方法查看最后 10 条数据。
file = pd.read_csv('demo.csv')
df = pd.DataFrame(file)
df.head()
df.tail()
目前用到的就是这些,之后用到再补充。
拿到数据之后,分析数据之间的逻辑,建立相应的能够表示数据间逻辑关系的数据结构,再进行相应的处理。
如果不追求内存和性能,那就看个人习惯了
牛啊,我直呼大佬 👍
感觉分块很方便
恰好可以用到呢 ~
哈哈,通过分块只是其中一个办法
嗯,值得借鉴啊。我现在头疼 xlsx 格式文件的处理。数据都是上百万行的,还是十几二十几张表的处理。原来的方法慢的要死了
小伙伴们可能没发现
这文章写的很好阿,怎么没人回复 ~~~ 牛阿!