从字典或列表创建熊猫数据帧太慢,任何建议



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

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

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

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

如何从 python 对象转到数据帧?也许我也可以使用别的东西。我最终想把它提供给一个sk-learn算法。

如果你只有01作为值,你应该使用np.boolnp.int8作为dtype - 这将减少你的内存消耗至少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

默认情况下,熊猫使用 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

您可以尝试的另一件事是启用 pyarrow。

spark.conf.set("spark.sql.execution.arrow.enabled", "true")

这使我对pd.DataFrame的呼叫速度加快了一个数量级!

(请注意,要使用 pyarrow,如果您使用较新的 pyarrow,则必须使用 pyspark>=3.0.0(例如:pyarrow>=1.0.0 )。 对于pyspark==2.x,使用pyrrrow==0.15.x是最容易的。

相关内容

  • 没有找到相关文章

最新更新