2016-06-21 93 views
3

我有其中一個用戶屬於多個類別的情況:大熊貓:解決交叉問題

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。

回答

2

您可以先從列表a,b,c創建DataFrame。然後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 
+0

甜的東西..這解決了它..感謝隊友:) – thealchemist

+0

很高興能幫助你!美好的一天! – jezrael