警察局的傻瓜稀疏=True时的数据帧大小与稀疏=Fals时的大小相同

2024-04-25 02:23:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含几个字符串列的dataframe,我想将它们转换为分类数据,这样我就可以运行一些模型并从中提取重要的特性。在

但是,由于唯一值的数量,一个热编码的数据会扩展为大量的列,这会导致性能问题。在

为了解决这个问题,我在get_dummies中尝试使用Sparse = True参数。在

test1 = pd.get_dummies(X.loc[:,['col1','col2','col3','col4']].head(10000))
test2 = pd.get_dummies(X.loc[:,['col1','col2','col3','col4']].head(10000),sparse = True)

但是,当我检查两个比较对象的信息时,它们占用的内存量相同。似乎Sparse = True使用的空间并没有减少。为什么?在

^{pr2}$

Tags: 数据字符串truedataframeget分类headloc
1条回答
网友
1楼 · 发布于 2024-04-25 02:23:09

我查看了pandasget_dummies源代码,但到目前为止还没有发现错误。下面是我做的一个小实验(前半部分是用真实数据重现你的问题)。在

In [1]: import numpy as np
   ...: import pandas as pd
   ...: 
   ...: a = ['a', 'b'] * 100000
   ...: A = ['A', 'B'] * 100000
   ...: 
   ...: df1 = pd.DataFrame({'a': a, 'A': A})
   ...: df1 = pd.get_dummies(df1)
   ...: df1.info()
   ...:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 200000 entries, 0 to 199999
Data columns (total 4 columns):
A_A    200000 non-null uint8
A_B    200000 non-null uint8
a_a    200000 non-null uint8
a_b    200000 non-null uint8
dtypes: uint8(4)
memory usage: 781.3 KB

In [2]: df2 = pd.DataFrame({'a': a, 'A': A})
   ...: df2 = pd.get_dummies(df2, sparse=True)
   ...: df2.info()
   ...:
<class 'pandas.core.sparse.frame.SparseDataFrame'>
RangeIndex: 200000 entries, 0 to 199999
Data columns (total 4 columns):
A_A    200000 non-null uint8
A_B    200000 non-null uint8
a_a    200000 non-null uint8
a_b    200000 non-null uint8
dtypes: uint8(4)
memory usage: 781.3 KB

到目前为止,与您的结果相同(df1的大小等于df2)的结果,但是如果我使用to_sparse和{}显式地将{}转换为{}

^{pr2}$

现在内存使用量是一半,因为一半的数据是0。在

总之,我不确定为什么get_dummies(sparse=True)不压缩数据帧,即使它被转换为sparsedaframe,但是有一个解决方法。相关的讨论正在github get_dummies with sparse doesn't convert numeric to sparse中进行,但结论似乎仍悬而未决。在

相关问题 更多 >