如何使用Pandas处理超过内存容量的大规模数据?( 二 )

如果数据集的一或多个列中具有大量的 NaN 空值 , 那么可以使用稀疏列表示降低内存使用 , 以免空值耗费内存 。
假定州名这一列存在一些空值 , 我们需要跳过所有包含空值的行 。 该需求可使用 pandas.sparse 轻松实现(译者注:原文使用 Sparse Series , 但在 Pandas 1.0.0 中已经移除了 SparseSeries) 。
如何使用Pandas处理超过内存容量的大规模数据?文章插图
有损压缩如果无损压缩并不满足需求 , 还需要进一步压缩 , 那么应该如何做?这时可使用有损压缩 , 权衡内存占用而牺牲数据百分之百的准确性 。
有损压缩有两种方式 , 即修改数值和抽样 。

  • 修改数值:有时并不需要数值保留全部精度 , 这时可以将 int64 截取为 int32 甚至是 int16 。
  • 抽样:如果需要确认某些州的新冠病例数要高于其它州 , 可以抽样部分州的数据 , 查看哪些州具有更多的病例 。 这种做法是一种有损压缩 , 因为其中并未考虑到所有的数据行 。
第二种技术:数据分块(chunking)另一个处理大规模数据集的方法是数据分块 。 将大规模数据切分为多个小分块 , 进而对各个分块分别处理 。 在处理完所有分块后 , 可以比较结果并给出最终结论 。
本文使用的数据集中包含了 1923 行数据 。
如何使用Pandas处理超过内存容量的大规模数据?文章插图
假定我们需要找出具有最多病例的州 , 那么可以将数据集切分为每块 100 行数据 , 分别处理每个数据块 , 从这各个小结果中获取最大值 。
如何使用Pandas处理超过内存容量的大规模数据?文章插图
本节代码片段如下:
#导入所需软件库import pandas as pd#数据集csv = ""#循环处理每个数据块 , 获取每个数据块中的最大值result = {}for chunk in pd.read_csv(csv, chunksize=100):max_case = chunk["cases"].max()max_case_county = chunk.loc[chunk['cases'] == max_case, 'county'].iloc[0]result[max_case_county] = max_case#给出结果print(max(result, key=result.get) , result[max(result, key=result.get)])代码地址: #file-chuncking-py
第三种方法:索引数据分块非常适用于数据集仅加载一次的情况 。 但如果需要多次加载数据集 , 那么可以使用索引技术 。
索引可理解为一本书的目录 。 无需读完整本书就可以获取所需得信息 。
例如 , 分块技术非常适用于获取指定州的病例数 。 编写如下的简单函数 , 就能实现这一功能 。
如何使用Pandas处理超过内存容量的大规模数据?文章插图
索引 vs 分块分块需读取所有数据 , 而索引只需读取部分数据 。
上面的函数加载了每个分块中的所有行 , 但我们只关心其中的一个州 , 这导致大量的额外开销 。 可使用 Pandas 的数据库操作 , 例如简单的做法是使用 SQLite 数据库 。
首先 , 需要将 DataFrame 加载到 SQLite 数据库 , 代码如下:
import sqlite3csv = ""# 创建新的数据库文件db = sqlite3.connect("cases.sqlite")# 按块加载 CSV 文件for c in pd.read_csv(csv, chunksize=100):# 将所有数据行加载到新的数据库表中c.to_sql("cases", db, if_exists="append")# 为“state”列添加索引db.execute("CREATE INDEX state ON cases(state)")db.close()代码地址: #file-load_into_db-py
为使用数据库 , 下面需要重写 get_state_info 函数 。
如何使用Pandas处理超过内存容量的大规模数据?文章插图
这样可降低内存占用 50% 。
小结处理大规模数据集时常是棘手的事情 , 尤其在内存无法完全加载数据的情况下 。 一些解决方案或是耗时 , 或是耗费财力 。 毕竟增加资源是最简单直接的解决方案 。
但是在资源受限的情况下 , 可以使用 Pandas 提供的一些功能 , 降低加载数据集的内存占用 。 其中的可用技术包括压缩、索引和数据分块 。
原文链接:
延伸阅读:
数据分析神器Pandas:如何用1行Python代码挖掘数据?-InfoQ
如何只用一行代码让Pandas加速四倍?-InfoQ
Koalas:让pandas轻松切换Apache Spark , 在大数据中规模应用-InfoQ
关注我并转发此篇文章 , 私信我“领取资料” , 即可免费获得InfoQ价值4999元迷你书 , 点击文末「了解更多」 , 即可移步InfoQ官网 , 获取最新资讯~