Chybeta

数据挖掘比赛(2)利用pandas读取大型数据集

数据比赛中,有时提供的数据集会很大,常规方法打不开,这时候就需要在读入时做些小处理,方便后续操作。

读入

以IJCAI-17比赛数据集中的user_pay.txt 和 user_view.txt 为例,user_pay.txt有 2.13Gb 之大,而user_view.txt 只有 174Mb 。两者的读入方法见下。

对于 user_view.txt 这种较小型的数据 ,直接读入即可。如下:

1
2
3
import pandas as pd
user_view_db = pd.read_table('user_view.txt',header=None,sep=',')
user_view_db.head()

但对于如 2.13Gb大的 user_pay.txt 的大型数据,如果直接读入,会让硬盘和内存飙满且速度非常慢(机子好的童鞋请忽略—)。对此,采取的策略是分块读入。在用 read_table 读入时指定 chunksize 参数和 iterator参数,如下:

1
user_pay_db = pd.read_table('user_pay.txt',header=None,sep=',',iterator=True,chunksize=10000)

(注:chunksize等于多少可以自己选定,iterator=True好像一般都这么设定:)至于why在stackoverflow上有相关问题但似乎没有满意的答案)

可以看到多了两个参数后,user_pay_db 不再是dataframe了,而是pandas.io.parsers.TextFileReader。想要查看它可以如下:

1
2
for chunk in user_pay_db:
print(chunk)

它会按照 chunksize 的大小打印出内容,如下:


(由于数据集过大,只截取部分内容)

处理

接下来的处理有两种,一是可以直接对 user_pay_db 中的每个 chunk 进行分块处理,也可以想办法把 此时为TextFileReader的 user_pay_db 转化为易于操作的 dataframe格式。这里只演示第二种方法。

我们可以借助 pandas 中的concat方法来合并数据集。如下:

1
df = pd.concat([chunk for chunk in user_pay_db],ignore_index=True)

这里用变量df来存储。我们给concat传了两个参数,第一个是利用了for循环,注意不要忽略了中括号;第二个参数用于告诉concat连接时忽略掉每个chunk中原有的index,否则等连接完后,会出现同一个index对应了多个项的情况,如下:

小结(题外话)

上面的代码是基于 Anaconda 4.2.0 (64-bit)集成包的。其pandas版本为0.18.1,而最新的pandas版本为0.19,其中的一些函数的使用方法做了更新,比如concat。希望读者在上述代码运行不了不对的情况下能查查文档留留言一起讨论:)

下面附上pandas的文档地址

pandas 0.18.1 文档

pandas 0.19.2 文档

不清楚自己pandas版本的,见下,其中version前后都是两个下划线__:

欢迎留言:)

微信扫码加入知识星球【漏洞百出】
chybeta WeChat Pay

点击图片放大,扫码知识星球【漏洞百出】

本文标题:数据挖掘比赛(2)利用pandas读取大型数据集

文章作者:chybeta

发布时间:2017年01月25日 - 13:01

最后更新:2017年06月20日 - 11:06

原始链接:http://chybeta.github.io/2017/01/25/数据挖掘比赛(2)利用pandas读取大型数据集/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。