熊猫:解决交叉表问题

时间:2016-06-21 10:15:55

标签: python pandas dataframe group-by pivot

我的情况是用户属于多个类别:

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。

1 个答案:

答案 0 :(得分:2)

您可以先从列表DataFrameab创建c。然后stackmerge原创。上次使用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