我的情况是用户属于多个类别:
UserID Category
1 A
1 B
2 A
3 A
4 C
2 C
4 A
A = 1,2,3,4
B = 1
C = 2,4
我想要使用pandas显示这样的数据的交叉表:
A B C
A 4 1 2
B 1 2 0
C 2 0 2
我试试:
df.groupby(UserID).agg(countDistinct('Category'))
我做了以上操作,但对于不在对角线上的元素,它返回0。
答案 0 :(得分:2)
您可以先从列表DataFrame
,a
,b
创建c
。然后stack
和merge
原创。上次使用crosstab
:
a = [1,2,3,4]
b = [1]
c = [2,4]
df1 = pd.DataFrame({'A':pd.Series(a), 'B':pd.Series(b), 'C':pd.Series(c)})
print (df1)
A B C
0 1 1.0 2.0
1 2 NaN 4.0
2 3 NaN NaN
3 4 NaN NaN
df2 = df1.stack()
.reset_index(drop=True, level=0)
.reset_index(name='UserID')
.rename(columns={'index':'newCat'})
print (df2)
newCat UserID
0 A 1.0
1 B 1.0
2 C 2.0
3 A 2.0
4 C 4.0
5 A 3.0
6 A 4.0
df3 = pd.merge(df, df2, on='UserID')
print (pd.crosstab(df3.newCat, df3.Category))
Category A B C
newCat
A 4 1 2
B 1 1 0
C 2 0 2