Python 对唯一对进行计数,并将计数存储在矩阵中

Python 对唯一对进行计数,并将计数存储在矩阵中,python,pandas,pivot,Python,Pandas,Pivot,我的问题类似于 我有这样的配对数据: 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 ATTR 3 10 1 20 1 20 4 30 10 20 30 1 | 0 2 0 3 | 1

我的问题类似于

我有这样的配对数据:

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   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,但得到的数据框为空:

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_表-

或者,pd交叉表-

或者,set_index+get_dummies+sumlevel=0

或者,让你的假人+圆点-

接下来,在v上调用reindex-


您可以使用类别

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

这是熊猫吗?x.pivot\u tableindex=0,columns=1,values=1,aggfunc='size',fill\u value=0@cᴏʟᴅsᴘᴇᴇᴅ 请看我最新的问题。这不是一个重复的问题,因为我正在寻找两种矩阵。类别同样聪明,对字符串也同样有效。干得好。
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(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
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