当前位置: 首页 > 面试题库 >

在熊猫中有效地创建稀疏数据透视表?

阎经武
2023-03-14
问题内容

我正在将具有两列(A和B)的记录列表转换成矩阵表示形式。我一直在熊猫中使用数据透视功能,但结果最终还是很大。大熊猫支持枢轴化为稀疏格式吗?我知道我可以先将其旋转,然后将其转换为某种稀疏表示,但并不像我想要的那么优雅。我的最终目标是将其用作预测模型的输入。

另外,大熊猫之外是否还有某种稀疏的枢轴能力?

编辑:这是一个非稀疏枢轴的示例

import pandas as pd
frame=pd.DataFrame()
frame['person']=['me','you','him','you','him','me']
frame['thing']=['a','a','b','c','d','d']
frame['count']=[1,1,1,1,1,1]

frame

  person thing  count
0     me     a      1
1    you     a      1
2    him     b      1
3    you     c      1
4    him     d      1
5     me     d      1

frame.pivot('person','thing')

        count            
thing       a   b   c   d
person                   
him       NaN   1 NaN   1
me          1 NaN NaN   1
you         1 NaN   1 NaN

这将创建一个矩阵,其中可能包含人和事物的所有可能组合,但并不稀疏。

http://docs.scipy.org/doc/scipy/reference/sparse.html

稀疏矩阵占用的空间较少,因为它们可以表示类似NaN或0的值。如果我有非常大的数据集,则该枢轴函数可以生成一个矩阵,由于NaN或0的数量很多,因此该矩阵应该稀疏。我希望通过生成一些稀疏的东西而不是创建一个密集的矩阵然后将其转换为稀疏的东西,可以节省很多空间/内存。


问题答案:

@khammel先前发布的答案很有用,但不幸的是由于熊猫和Python的更改,该答案不再有效。以下应该产生相同的输出:

from scipy.sparse import csr_matrix
from pandas.api.types import CategoricalDtype

person_c = CategoricalDtype(sorted(frame.person.unique()), ordered=True)
thing_c = CategoricalDtype(sorted(frame.thing.unique()), ordered=True)

row = frame.person.astype(person_c).cat.codes
col = frame.thing.astype(thing_c).cat.codes
sparse_matrix = csr_matrix((frame["count"], (row, col)), \
                           shape=(person_c.categories.size, thing_c.categories.size))

>>> sparse_matrix
<3x4 sparse matrix of type '<class 'numpy.int64'>'
     with 6 stored elements in Compressed Sparse Row format>

>>> sparse_matrix.todense()
matrix([[0, 1, 0, 1],
        [1, 0, 0, 1],
        [1, 0, 1, 0]], dtype=int64)


dfs = pd.SparseDataFrame(sparse_matrix, \
                         index=person_c.categories, \
                         columns=thing_c.categories, \
                         default_fill_value=0)
>>> dfs
        a   b   c   d
 him    0   1   0   1
  me    1   0   0   1
 you    1   0   1   0

主要变化是:

  • .astype()不再接受“分类”。您必须创建一个CategoricalDtype对象。
  • sort() 不再工作了

其他更改更肤浅:

  • 使用类别大小而不是唯一的Series对象的长度,只是因为我不想不必要地制作另一个对象
  • csr_matrixframe["count"])的数据输入不必是列表对象
  • 熊猫SparseDataFrame现在直接接受scipy.sparse对象


 类似资料:
  • 我有一个这样的数据帧: 我想知道我们如何使用GROUPBY实现相同的结果? 感谢帮助。 类似的问题: Pandas列值到列?

  • 问题内容: 有没有一种方法可以从a转换为,而不会在内存中生成密集矩阵? 不起作用,因为它生成一个密集矩阵,该矩阵被强制转换为。 提前致谢! 问题答案: 熊猫文档讨论了将稀疏稀疏性实验转换为SparseSeries.to_coo: http://pandas-docs.github.io/pandas-docs-travis/sparse.html#interaction-with- scipy-s

  • 问题内容: 我注意到Pandas现在已支持稀疏矩阵和数组。目前,我创建这样的: 有没有办法用或创建一个?转换为密集格式会严重破坏RAM。谢谢! 问题答案: 不支持直接转换ATM。欢迎捐款! 试试这个,在内存上应该没问题,因为SpareSeries很像csc_matrix(用于1列),而且空间效率很高

  • 问题内容: 我有一个非常希望直截了当的问题,在最近3个小时中,这一直给我带来很多困难。应该很容易。 这是挑战。 我有一个熊猫数据框: 我想要将数据框转换为: 值是值计数。有人有见识吗?谢谢! 问题答案: 这是重塑数据的几种方法 1) 使用 2) 或者,在over上使用,然后填充零。 3) 或者使用与, 4) 或者,与

  • 我有一个带有两个变量X和Y的pandas数据帧(大约1M行),并且希望使用scipy,sparse创建一个稀疏矩阵。输出应该是一个n x m矩阵,如果x=x和Y=Y,则其条目为1。 下面是数据结构的示例 所需的输出为 提前致谢

  • 请看示例代码(注意 data 的数组下标): -- http://www.kyne.com.au/~mark/software/lua-cjson.php -- version: 2.1 devel local json = require("cjson") local data = {1, 2} data[1000] = 99 -- ... do the other things ngx.