Python 从dict或list创建数据帧太慢,有什么建议吗?

Python 从dict或list创建数据帧太慢,有什么建议吗?,python,pandas,dataframe,scikit-learn,Python,Pandas,Dataframe,Scikit Learn,您好,我正在尝试从(一个dict列表或一个dict的dict)创建一个最终形状为60000行10000列的pandas数据帧 列的值为0或1,并且非常稀疏 list/dict对象创建速度很快,但当我从\u dict或\u记录创建时,会出现内存错误。我还尝试定期而不是一次附加到数据帧,但仍然无法工作。我还试着改变所有的单个细胞,但没有成功 顺便说一下,我正在从我解析的100个json文件构建python对象 如何从python对象转换到数据帧?也许我还可以用点别的。我最终想把它输入到一个sk-le

您好,我正在尝试从(一个dict列表或一个dict的dict)创建一个最终形状为60000行10000列的pandas数据帧

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

list/dict对象创建速度很快,但当我从\u dict或\u记录创建时,会出现内存错误。我还尝试定期而不是一次附加到数据帧,但仍然无法工作。我还试着改变所有的单个细胞,但没有成功

顺便说一下,我正在从我解析的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
它现在消耗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
[41]中的
:df_bool=df.astype(np.bool)
在[42]:df_bool.info()中
范围索引:60000条,0到59999
列:10000个条目,0到9999
数据类型:布尔(10000)
内存使用率:572.2 MB

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

这将我对
pd.DataFrame
的调用速度提高了一个数量级


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

,则最简单。

谢谢,这肯定有帮助,我还想知道原文部分,它会比其他数据结构更快地解析某些数据结构吗?正如我所知,更平坦的数据结构比嵌套的数据结构效率更高。@Kevin,非常欢迎!:)如果您关心将数据从磁盘读取到磁盘的速度,那么您可能需要检查这一点
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
spark.conf.set("spark.sql.execution.arrow.enabled", "true")