python - 从字典或列表创建 pandas 数据帧太慢,有什么建议吗?

标签 python pandas dataframe scikit-learn

您好,我正在尝试从(字典列表或字典的字典)创建一个 pandas 数据框,其最终形状为 60,000 行和 10,000~ 列

列的值为 0 或 1,并且非常稀疏。

列表/字典对象创建速度很快,但是当我执行 from_dict 或 from_records 时,会出现内存错误。我还尝试定期而不是立即附加到数据帧,但它仍然不起作用。我也尝试更改所有单个单元格,但无济于事。

顺便说一句,我正在从我解析的 100 个 json 文件构建我的 python 对象。

如何从 python 对象转换为数据帧?也许我还可以用别的东西。我最终想将其输入 sk-learn 算法。

最佳答案

如果只有 01 作为值,则应使用 np.boolnp.int8作为数据类型 - 这将减少至少 4 倍的内存消耗。

这是一个小演示:

In [34]: df = pd.DataFrame(np.random.randint(0,1,(60000, 10000)))

In [35]: df.shape
Out[35]: (60000, 10000)

In [36]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 60000 entries, 0 to 59999
Columns: 10000 entries, 0 to 9999
dtypes: int32(10000)
memory usage: 2.2 GB

每个默认 pandas 使用 np.int32 (32 位或 4 字节)作为整数

让我们将其向下转换为 np.int8:

In [39]: df_int8 = df.astype(np.int8)

In [40]: df_int8.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 60000 entries, 0 to 59999
Columns: 10000 entries, 0 to 9999
dtypes: int8(10000)
memory usage: 572.2 MB

现在消耗 572 MB,而不是 2.2 GB(减少了 4 倍)

或使用np.bool:

In [41]: df_bool = df.astype(np.bool)

In [42]: df_bool.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 60000 entries, 0 to 59999
Columns: 10000 entries, 0 to 9999
dtypes: bool(10000)
memory usage: 572.2 MB

关于python - 从字典或列表创建 pandas 数据帧太慢,有什么建议吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37546180/

相关文章:

Python - Unicode 和双反斜杠

python - 带有颜色图的散点图使 X 轴消失

python - python 向后累积计数

python-3.x - 使用 Pandas 计算指数移动平均线

python - 基于MultiColumn二级的圆柱

python - 在 pandas.read_csv() 中使用自定义对象

python - cython prange 不如单线程快

python - 为 Windows 编译 unix make 文件

r - 根据 R 中的日期(年度)创建排名

python - 使用 to_datetime() 转换为 datetime64 格式