【问题标题】:Count unique pairs and store counts in a matrix计算唯一对并将计数存储在矩阵中
【发布时间】:2018-01-23 02:26:04
【问题描述】:

我的问题类似于stackoverflow.com/q/7549410

我的配对数据如下所示:

ID   ATTR
3    10
1    20
1    20
4    30

我想计算唯一对并将这些频率计数存储在这样的矩阵中:

     10   20   30
1 |   0    2    0
3 |   1    0    0
4 |   0    0    1

或者,如果已知 ID 在 {1, 2, 3, 4} 中取值,而 ATTR 在 {0, 10, 20, 30} 中取值,那么我想要这样的矩阵:

     0   10   20   30
1 |  0    0    2    0
2 |  0    0    0    0
3 |  0    1    0    0
4 |  0    0    0    1

问题:在 Python 或 NumPy 中实现这两种方法的最快方法是什么?

我尝试过使用 Pandas,但我得到一个空的 DataFrame:

import numpy as np
import pandas as pd
x = pd.DataFrame([[3, 10], [1, 20], [1, 20], [4, 30]])
x.pivot_table(index = 0, columns = 1, fill_value = 0, aggfunc = 'sum')

【问题讨论】:

  • 这是熊猫吗?
  • x.pivot_table(index=0, columns=1, values=1, aggfunc='size', fill_value=0)
  • @cᴏʟᴅsᴘᴇᴇᴅ 请查看我更新的问题。这不是一个重复的问题,因为我正在寻找两种矩阵。

标签: python pandas pivot


【解决方案1】:

您似乎想要执行交叉制表,然后执行重新索引操作。对于交叉表,有很多方法可以给猫剥皮。

首先,使用pivot_table -

v = x.pivot_table(
      index=0, 
      columns=1, 
      values=1, 
      aggfunc='size', 
      fill_value=0
)

或者,pd.crosstab -

v = pd.crosstab(x[0], x[1])

或者,set_index + get_dummies + sum(level=0)

v = pd.get_dummies(x.set_index(0)[1]).sum(level=0)

或者,get_dummies + dot -

v = pd.get_dummies(x[0]).T.dot(pd.get_dummies(x[1]))

v

   10  20  30
1   0   2   0
3   1   0   0
4   0   0   1

接下来,在v 上致电reindex -

v.reindex(index=range(1, 5), columns=range(0, 40, 10), fill_value=0)

1  0   10  20  30
0                
1   0   0   2   0
2   0   0   0   0
3   0   1   0   0
4   0   0   0   1

【讨论】:

    【解决方案2】:

    你可以使用分类

    df.ID=df.ID.astype('category',categories=[1,2,3,4])
    df.ATTR=df.ATTR.astype('category',categories=[0,10,20,30])
    
    pd.crosstab(df.ID,df.ATTR)
    Out[1143]: 
    ATTR  0   10  20  30
    ID                  
    1      0   0   2   0
    2      0   0   0   0
    3      0   1   0   0
    4      0   0   0   1
    

    【讨论】:

    • Categories 同样聪明,也同样适用于字符串。做得很好。
    猜你喜欢
    • 2015-04-23
    • 1970-01-01
    • 2021-08-07
    • 2017-02-09
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    • 1970-01-01
    相关资源
    最近更新 更多