计算唯一对的数量并将计数存储在矩阵中

2024-04-04

我的问题类似于stackoverflow.com/q/7549410 https://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

Question:在 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')

看起来您想要执行交叉制表,然后执行重新索引操作。对于交叉制表,剥猫皮的方法有很多种。

首先,使用pivot_table -

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

Or, pd.crosstab -

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

Or, set_index + get_dummies + sum(level=0)

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

Or, 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

接下来,致电reindex on v -

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算唯一对的数量并将计数存储在矩阵中 的相关文章

随机推荐