我的问题类似于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,10,4}中取值{1,2,3,4},而{0,10,20,30}中的ATTR,那么我想要一个矩阵:
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')
答案 0 :(得分:3)
看起来您想要执行交叉制表,然后进行重建索引操作。对于交叉制表,有许多方法可以给猫皮肤。
首先,使用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
接下来,在reindex
-
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
答案 1 :(得分: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