2016-06-21 2 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

Вы можете сначала создать 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 
+0

слащавости .. это решает это .. спасибо спариваться :) – thealchemist

+0

Рад может помочь вам! Приятный день! – jezrael

Смежные вопросы