【问题标题】:python - create a pivot tablepython - 创建一个数据透视表
【发布时间】:2013-06-10 16:12:27
【问题描述】:

我正在尝试从 python 中的 Numpy 数组创建数据透视表。我做了很多研究,但我找不到一个直接的解决方案。我知道你可以用 Pandas 做到这一点,但我在安装它时遇到了麻烦——但必须有一种方法可以在没有 Pandas 的情况下做到这一点。我的 Numpy 数组是

[[ 4057     8  1374]
 [ 4057     9   759]
 [ 4057    11    96]
 ..., 
 [89205    16   146]
 [89205    17   154]
 [89205    18   244]]

我需要一个数据透视表,其中行是第一列,列是第二列,值是第三列。请帮忙!

谢谢

【问题讨论】:

    标签: python numpy pivot-table


    【解决方案1】:

    我想这就是你想要的:

    data = np.array([[ 4057,     8,  1374],
                     [ 4057,     9,   759],
                     [ 4057,    11,    96],
                     [89205,    16,   146],
                     [89205,    17,   154],
                     [89205,    18,   244]])
    
    rows, row_pos = np.unique(data[:, 0], return_inverse=True)
    cols, col_pos = np.unique(data[:, 1], return_inverse=True)
    
    pivot_table = np.zeros((len(rows), len(cols)), dtype=data.dtype)
    pivot_table[row_pos, col_pos] = data[:, 2]
    
    >>> pivot_table
    array([[1374,  759,   96,    0,    0,    0],
           [   0,    0,    0,  146,  154,  244]])
    >>> rows
    array([ 4057, 89205])
    >>> cols
    array([ 8,  9, 11, 16, 17, 18])
    

    这种方法有一些限制,主要是,如果您对相同的行/列组合有重复的条目,它们不会被添加在一起,而只会保留一个(可能是最后一个)。如果你想把它们加在一起,虽然有点复杂,你可以滥用 scipy 的 sparse 模块:

    data = np.array([[ 4057,     8,  1374],
                     [ 4057,     9,   759],
                     [ 4057,    11,    96],
                     [89205,    16,   146],
                     [89205,    17,   154],
                     [89205,    18,   244],
                     [ 4057,    11,     4]])
    
    rows, row_pos = np.unique(data[:, 0], return_inverse=True)
    cols, col_pos = np.unique(data[:, 1], return_inverse=True)
    
    pivot_table = np.zeros((len(rows), len(cols)), dtype=data.dtype)
    pivot_table[row_pos, col_pos] = data[:, 2]
    >>> pivot_table # the element at [0, 2] should be 100!!!
    array([[1374,  759,    4,    0,    0,    0],
           [   0,    0,    0,  146,  154,  244]])
    
    import scipy.sparse as sps
    pivot_table = sps.coo_matrix((data[:, 2], (row_pos, col_pos)),
                                 shape=(len(rows), len(cols))).A
    >>> pivot_table # now repeated elements are added together
    array([[1374,  759,  100,    0,    0,    0],
           [   0,    0,    0,  146,  154,  244]])
    

    【讨论】:

    • 幸运的是,我的数据不应该有你提到的重复条目
    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2021-10-26
    相关资源
    最近更新 更多