我有一个包含数百万行的数据框,我想将所有数据保留在稀疏的稀疏矩阵中,以防止出现内存问题。
id value count
002 groupB 1
001 groupB 3
001 groupC 1
003 groupC 2
002 groupA 1
004 groupZ 1
...
df.groupby(['id', 'value'])['count'].sum()
id value
1 groupB 3
groupC 1
2 groupA 1
groupB 1
3 groupC 2
4 groupZ 1
Name: count, dtype: int64
我正在尝试将groupby sum的结果用于稀疏矩阵。我在columns_names
数组中的预定义标题/列名称。我查了csc_matrix和csr_matrix,但不知道如何将groupby结果转换为稀疏。
我的最终目标是拥有一个这样的数据框,并带有预定义的列名(不一定按字母顺序):
id groupA groupB groupC groupD groupE .. groupZ groupAA ...
001 0 3 1 0 0 0 0
002 1 1 0 0 0 0 0
003 0 0 2 0 0 0 0
004 0 0 0 0 0 1 0
...
答案 0 :(得分:0)
在熊猫0.23中,有一个SparseSeries数据结构,您可以使用它来获得稀疏矩阵:
s = df.groupby(['id', 'value'])['count'].sum()
ss = s.to_sparse() # convert to sparse series
coo, rows, columns = ss.to_coo(row_levels=['id'], column_levels=['value'], sort_labels=True) # convert to coo
result = coo.tocsr() # convert to csr
print(result)
输出
(0, 1) 3
(0, 2) 1
(1, 0) 1
(1, 1) 1
(2, 2) 2
(3, 3) 1
首先将其转换为稀疏序列,然后转换为coo(请参见to_coo),最后,如果需要,将其转换为csr。可变的行和列包含来自多索引的行和列标签。对于上面的示例,列标签为:
['groupA', 'groupB', 'groupC', 'groupZ']
,行标签为:
[1, 2, 3, 4]