我有一个pandas DataFrame df
形状(1000000,3)如下:
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()
?