2012-10-12 10 views
29
df2 = pd.DataFrame({'X' : ['X1', 'X1', 'X1', 'X1'], 'Y' : ['Y2','Y1','Y1','Y1'], 'Z' : ['Z3','Z1','Z1','Z2']}) 

    X Y Z 
0 X1 Y2 Z3 
1 X1 Y1 Z1 
2 X1 Y1 Z1 
3 X1 Y1 Z2 

g=df2.groupby('X') 

pd.pivot_table(g, values='X', rows='Y', cols='Z', margins=False, aggfunc='count') 

Traceback (most recent call last): ... AttributeError: 'Index' object has no attribute 'index'Python Pandy: Stół obrotowy z aggfunc = liczyć unikalny odrębne

Jak mogę dostać tabeli przestawnej z liczby unikatowych wartości jednej kolumnie DataFrame dla dwóch innych kolumn?
Czy istnieje aggfunc dla liczby unikalnej? Czy powinienem używać np.bincount()?

NB. Jestem świadomy "Serii" values_counts(), ale potrzebuję tabeli przestawnej.


EDIT: Wyjście powinno być:

Z Z1 Z2 Z3 
Y    
Y1 1 1 NaN 
Y2 NaN NaN 1 
+0

można zakładać wyjście chcesz – root

+0

mam przedstawiły szereg szczegółowych przykładów i alternatywne podejścia w tym [** Q & A **] (https://stackoverflow.com/q/47152691/2336654) – piRSquared

Odpowiedz

47

Czy chodziło Ci o coś takiego?

In [39]: df2.pivot_table(values='X', rows='Y', cols='Z', 
         aggfunc=lambda x: len(x.unique())) 
Out[39]: 
Z Z1 Z2 Z3 
Y    
Y1 1 1 NaN 
Y2 NaN NaN 1 

Należy pamiętać, że stosując len zakłada nie masz NA w twoich DataFrame. W przeciwnym razie możesz wykonać x.value_counts().count() lub .

+0

Dziękujemy! To robi dokładnie to, co chciałem. – dmi

+6

Aby zaktualizować to nowszym rozwiązaniem pandy, 'aggfunc = pd.Series.nunique' rozwiąże problem i powinno być bardziej wydajne. – hume

1

Możesz skonstruować tabelę przestawną dla każdej odrębnej wartości X. W tym przypadku,

for xval, xgroup in g: 
    ptable = pd.pivot_table(xgroup, rows='Y', cols='Z', 
     margins=False, aggfunc=numpy.size) 

skonstruuje stół obrotowy dla każdej wartości X. Możesz indeksować ptable używając xvalue. Z tego kodu, otrzymuję (dla X1)

 X   
Z Z1 Z2 Z3 
Y    
Y1 2 1 NaN 
Y2 NaN NaN 1 
+1

Dziękuję. Jednak nie liczę liczby wystąpień każdej odrębnej wartości X, zliczam liczbę odrębnych wartości w X dla Y i Z. – dmi

8

myślę, że to będzie bardziej doskonałe:

df2.pivot_table(values='X',rows=['Y','Z'],cols='X',aggfunc='count') 


       X1 X2 
Y Z  
Y1 Z1 1 1 
     Z2 1 NaN 
Y2 Z3 1 NaN 
+0

To robi dokładnie to, co jest wymagane bez niejasnej lambda. – Alper

Powiązane problemy