作者:Itamar Turner-Trauring
翻译:老齐
与本文相关的图书推荐:《跟老齐学Python:数据分析》
让我们想象,你有一个非常大的数据集,以至于读入内存之后会导致溢出,但是你想将它的一部分用Pandas进行处理,如果你在某个时间点只是想加载这个数据集的一部分,可以使用分块方法。
如果把数据集分为若干部分之后,分别加载进来,最终还是会很慢。
此时的解决方法,就是创建一个可供搜索的索引,使用SQLite就能轻松解决。
第一个方法:分块
来设想一个具体的示例:你要参加某个竞选,为此,你找到了一个CSV文件,里面包含你所在城市每个选民的信息。于是乎你派人去挨门挨户地拜访,邀请特定街道的所有登记选民参与投票。
现在,Pandas的DataFrame对象中有索引,但是必须要将数据读入内存,然而CSV文件太大了,内存无法容纳,于是,你想到,可以只载入你关注的记录。
这就是第一个方法,进行分块。
import pandas as pd
def get_voters_on_street(name):
return pd.concat(
df[df["street"] == name] for df in
pd.read_csv("voters.csv", chunksize=1000)
)
复制代码
以分块的方式加载CSV文件,并且按照街道名称进行筛选,然后将得到记录并为一体。
虽然逐行加载,但是关注的是比较小的子集,所以需要一些开销。比如,对于只有70k的数据集,在我的计算机上执行上面的函数,需要574ms。2018年纽约市有460万登记选民,挨个街道查找,需要30s。
如果我们只做一次,没关系,如果需要反复做,这种方法并不是最佳。
创建索引对象
索引就是摘要,有这样一种说法:如果你关心它,就能在这里找到大量数据。在我们的示例中,我们想根据街道名称创建索引,于是就可以快速加载投票者所在的街道了。