【发布时间】:2015-05-16 05:24:50
【问题描述】:
我有一个形状为 (1000000,3) 的 pandas DataFrame df,如下所示:
id cat team
1 'cat1' A
1 'cat2' A
2 'cat3' B
3 'cat1' A
4 'cat3' B
4 'cat1' B
然后,我对 cat 列进行虚拟化,以便为机器学习分类做好准备。
df2 = pandas.get_dummies(df,columns=['cat'], sparse=True)
但是当我尝试这样做时:
df2.groupby(['id','team']).sum()
它卡住了,计算永远不会结束。因此,我没有立即分组,而是尝试:
df2 = df2.fillna(0)
但它不起作用,DataFrame 仍然充满了NaN 值。为什么fillna() 函数没有按应有的方式填充我的 DataFrame?
换句话说,我从 get_dummies 得到的 pandas 稀疏矩阵如何填充为 0 而不是 NaN?
我也试过了:
df2 = pandas.get_dummies(df,columns=['cat'], sparse=True).to_sparse(fill_value=0)
这一次df2很好地填充了0,但是当我尝试时:
print df2.groupby(['id','sexe']).sum()
我明白了:
C:\Anaconda\lib\site-packages\pandas\core\groupby.pyc in loop(labels, shape)
3545 for i in range(1, nlev):
3546 stride //= shape[i]
-> 3547 out += labels[i] * stride
3548
3549 if xnull: # exclude nulls
ValueError: operands could not be broadcast together with shapes (1205800,) (306994,) (1205800,)
我的解决方案是:
df2 = pandas.DataFrame(np.nan_to_num(df2.as_matrix()))
df2.groupby(['id','sexe']).sum()
它可以工作,但需要大量内存。有人可以帮我找到更好的解决方案,或者至少理解为什么我不能轻松地用零填充稀疏矩阵吗?以及为什么不可能在稀疏矩阵上使用groupby() 然后sum()?
【问题讨论】:
-
对未来问题的一般建议 FWIW:如果可能,请提供一个更完整的示例,其中包含通过
randn、tile和/或repeat等 numpy 函数提供的示例数据。每当您进入性能和效率时,准确了解数据结构就变得非常重要。例如,在您的情况下,groupby和get_dummies的性能不仅会因数据大小而异,而且会因不同组的数量而异。人们很难在不了解更多信息的情况下回答与性能相关的问题(尤其是当您添加sparse时) -
另外,我对机器学习了解不多,但如果你能创建一个相当短(但仍然完整)的示例,从数据创建一直到机器学习代码的简化版本,您可能会得到更好的帮助。
标签: pandas fill sparse-matrix