Python 熊猫:解决交叉表问题

Python 熊猫:解决交叉表问题,python,pandas,dataframe,group-by,pivot,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 我想要一个交叉表,它使用熊猫显示如下数据: A B C A 4 1 2 B 1 2 0 C 2 0 2 我尝试: df.groupby(UserID).agg(countDi

我遇到一个用户属于多个类别的情况:

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
我想要一个交叉表,它使用熊猫显示如下数据:

  A  B  C
A 4  1  2

B 1  2  0

C 2  0  2
我尝试:

df.groupby(UserID).agg(countDistinct('Category'))

我做了上述操作,但对于不在对角线上的元素,它返回0。

您可以首先从列表
a
b
c
创建
DataFrame
。然后把它改成原来的样子。最后用途:


很高兴能帮助你!天气真好!
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