2015-06-06 16 views
10

Ho una domanda speranzosa che mi ha dato molte difficoltà nelle ultime 3 ore. Dovrebbe essere facile.Tabelle pivot o Raggruppa per per Panda?

Ecco la sfida.

ho un dataframe panda:

+--------------------------+ 
|  Col 'X' Col 'Y' | 
+--------------------------+ 
|  class 1  cat 1 | 
|  class 2  cat 1 | 
|  class 3  cat 2 | 
|  class 2  cat 3 | 
+--------------------------+ 

Quello che sto cercando di trasformare la dataframe in:

+------------------------------------------+ 
|     cat 1 cat 2 cat 3 | 
+------------------------------------------+ 
|  class 1   1  0  0 | 
|  class 2   1  0  1 | 
|  class 3   0  1  0 | 
+------------------------------------------+ 

dove i valori sono conteggi di valore. Qualcuno ha qualche intuizione? Grazie!

risposta

25

Qui ci sono un paio di modi per rimodellare i dati df

In [27]: df 
Out[27]: 
    Col X Col Y 
0 class 1 cat 1 
1 class 2 cat 1 
2 class 3 cat 2 
3 class 2 cat 3 

1) Utilizzando pd.crosstab()

In [28]: pd.crosstab(df['Col X'], df['Col Y']) 
Out[28]: 
Col Y cat 1 cat 2 cat 3 
Col X 
class 1  1  0  0 
class 2  1  0  1 
class 3  0  1  0 

2) Oppure, utilizzare groupby su 'Col X','Col Y' con unstack sopra Col Y, poi riempire NaNs con zero.

In [29]: df.groupby(['Col X','Col Y']).size().unstack('Col Y', fill_value=0) 
Out[29]: 
Col Y cat 1 cat 2 cat 3 
Col X 
class 1  1  0  0 
class 2  1  0  1 
class 3  0  1  0 

3) In alternativa, utilizzare pd.pivot_table() con index=Col X, columns=Col Y

In [30]: pd.pivot_table(df, index=['Col X'], columns=['Col Y'], aggfunc=len, fill_value=0) 
Out[30]: 
Col Y cat 1 cat 2 cat 3 
Col X 
class 1  1  0  0 
class 2  1  0  1 
class 3  0  1  0 

4) In alternativa, utilizzare set_index con unstack

In [492]: df.assign(v=1).set_index(['Col X', 'Col Y'])['v'].unstack(fill_value=0) 
Out[492]: 
Col Y cat 1 cat 2 cat 3 
Col X 
class 1  1  0  0 
class 2  1  0  1 
class 3  0  1  0 
+0

Grazie Giovanni - che era incredibilmente disponibile, soprattutto fornendo diverse possibilità S! Non ho nemmeno pensato alla possibilità della croce. – SteelyDanish

+0

Grazie per il confronto di tutti e tre. Ho impostato il default su groupby, e spesso vedo pivot_table usato. –

+0

si è imbattuto in questo perché stavo cercando di capire la differenza tra groupby e pivot_table e quando usare quale. La tua risposta è stata certamente utile. Conoscete informazioni in qualche modo facilmente comprensibili sui diversi concetti? Saluti –