本文最后更新于:4 分钟前

真实世界中我们通常要处理数据量很大的文件(千万级、亿级)。如果直接使用pandas的IO函数读取这类文件,机器的内存一般吃不消。

为了高效处理大文件,pandas的IO函数提供了分块读取的功能(通过chunksize参数实现)。我们看一个例子。

引例

'ex6.csv’是包含10000行数据的文件(下载),其结构如下:

image-20200802142212061

假设现在希望统计’key’列所有值的频次。如果能一次读取该文件,可以直接使用Series.value_counts方法解决:

df = read_csv('ex6.csv')
df.value_counts()

上述方法对于本例的数据量来说还可行,但如果文件过大,我们一般会先分块读取,再进行操作。对于本例来说就是先将文件读取为一个个块(chunk),再统计各个块的值的频次,然后将所有统计结果(Series对象)相加:

chunker = read_csv('ex6.csv', chunksize=1000)  # 分块读取,每个块包含1000行数据

tot = pd.Series()  # 创建空Series 用于保存中间计算结果
for chunk in chunker:
    tot = tot.add(chunk['key'].value_counts(), fill_value=0)  # 各chunk数值统计结果再求和
tot = tot.sort_values(ascending=False)  # 降序排列
  • chunk['key'].value_counts()会获得每个块的数值频次的统计结果(返回Seires对象)
  • Series.add方法可以实现两个Series的加法,还可以设置fill_value参数以填充空缺值。

还会陆续补充其他案例…


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

吉他弹唱练习:兰花草 上一篇
Pandas常用操作参考手册 下一篇