您好,我正在尝试从(字典列表或字典的字典)创建一个 pandas 数据框,其最终形状为 60,000 行和 10,000~ 列
列的值为 0 或 1,并且非常稀疏。
列表/字典对象创建速度很快,但是当我执行 from_dict 或 from_records 时,会出现内存错误。我还尝试定期而不是立即附加到数据帧,但它仍然不起作用。我也尝试更改所有单个单元格,但无济于事。
顺便说一句,我正在从我解析的 100 个 json 文件构建我的 python 对象。
如何从 python 对象转换为数据帧?也许我还可以用别的东西。我最终想将其输入 sk-learn 算法。
最佳答案
如果只有 0
和 1
作为值,则应使用 np.bool
或 np.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/