2015-06-06 7 views
10

Ich habe eine hoffentlich einfache Frage, die mir in den letzten 3 Stunden eine Menge Schwierigkeiten bereitet hat. Es sollte einfach sein.Pivot-Tabellen oder Gruppe von für Pandas?

Hier ist die Herausforderung.

Ich habe einen Pandas Datenrahmen:

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

Was ich suche den Datenrahmen in verwandeln:

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

Wo liegt der Wert Wert zählt. Hat jemand eine Einsicht? Vielen Dank!

Antwort

25

Hier sind einige Möglichkeiten 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) Mit 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) Oder Ihre Daten groupby auf 'Col X','Col Y' mit unstack über Col Y verwenden, um neu zu gestalten, dann füllen Sie NaNs mit Nullen.

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) Oder verwenden pd.pivot_table() mit 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) Oder verwenden set_index mit 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

Dank John - das war unglaublich hilfreich, insbesondere Bereitstellung unterschiedlicher Möglichkeiten s! Ich habe nicht einmal an die Möglichkeit der Kreuztabellen gedacht. – SteelyDanish

+0

Danke für den Vergleich aller drei. Ich verwende standardmäßig groupby und sehe oft pivot_table. –

+0

stolperte, weil ich versuchte, den Unterschied zwischen groupby und pivot_table herauszufinden und wann zu verwenden. Ihre Antwort war sicherlich hilfreich. Kennst du irgendwie leicht verständliche Informationen zu den verschiedenen Konzepten? Prost –

Verwandte Themen