2012-10-12 13 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 Pandas: tabella pivot con aggfunc = conteggio distinto unico

Come faccio ad avere una tabella pivot con conteggi di valori unici di una colonna dataframe per le altre due colonne?
Esiste aggfunc per conteggio unico? Dovrei usare np.bincount()?

NB. Sono a conoscenza di 'Series' values_counts() ma ho bisogno di una tabella pivot.


EDIT: L'output dovrebbe essere:

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

puoi pubblicare l'output che si desidera – root

+0

ho fornito molti esempi dettagliati e approcci alternativi in ​​questo [** Q & A **] (https://stackoverflow.com/q/47152691/2336654) – piRSquared

risposta

47

vuoi dire qualcosa di simile?

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 

noti che usare len presuppone che non si dispone di NA s nel vostro dataframe. Puoi fare x.value_counts().count() o len(x.dropna().unique()) in caso contrario.

+0

Grazie! Questo fa esattamente quello che volevo. – dmi

+6

Solo per aggiornare questo con una nuova soluzione pandas, 'aggfunc = pd.Series.nunique' risolverà il problema e dovrebbe essere più performante. – hume

1

È possibile costruire una tabella pivot per ciascun valore distinto di X. In questo caso,

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

costruirà una tabella pivot per ciascun valore di X. Si consiglia di indicizzare ptable utilizzando xvalue. Con questo codice, ottengo (per X1)

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

Grazie. Tuttavia non sto contando il numero di occorrenze di ciascun valore distinto di X, sto contando il numero di valori distinti in X per Y e Z. – dmi

8

Penso che questo sarà più perfetta:

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

Questo fa esattamente ciò che è richiesto senza un lambda oscuro. – Alper