使用 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()

目前用到的就是这些,之后用到再补充。

拿到数据之后,分析数据之间的逻辑,建立相应的能够表示数据间逻辑关系的数据结构,再进行相应的处理。