2016-05-03 11 views
7

Ich habe Daten wie diese in einer CSV-DateiPandas groupby für Null-Werte

Symbol,Action,Year 
AAPL,Buy,2001 
AAPL,Buy,2001 
BAC,Sell,2002 
BAC,Sell,2002 

ich in der Lage bin, es zu lesen und GROUPBY wie diese

df.groupby(['Symbol','Year']).count() 

ich

   Action 
Symbol Year   
AAPL 2001  2 
BAC 2002  2 

Ich wünsche dies (Reihenfolge spielt keine Rolle)

   Action 
Symbol Year   
AAPL 2001  2 
AAPL 2002  0 
BAC 2001  0 
BAC 2002  2 

Ich möchte wissen, ob seine mögliche für Null Vorkommen zählen zu

Antwort

8

können Sie verwenden pivot_table mit unstack:

print df.pivot_table(index='Symbol', 
        columns='Year', 
        values='Action', 
        fill_value=0, 
        aggfunc='count').unstack() 

Year Symbol 
2001 AAPL  2 
     BAC  0 
2002 AAPL  0 
     BAC  2 
dtype: int64 

Wenn Sie Ausgabe als DataFrame Verwendung to_frame benötigen:

print df.pivot_table(index='Symbol', 
        columns='Year', 
        values='Action', 
        fill_value=0, 
        aggfunc='count').unstack() 
            .to_frame() 
            .rename(columns={0:'Action'}) 

      Action 
Year Symbol   
2001 AAPL   2 
    BAC   0 
2002 AAPL   0 
    BAC   2 
+0

Diese macht eine schöne Pivot-Tabelle, aber die Verwendung von fill_value = 0 tut es immer noch nicht Zeige die Zeilen mit einer Zählung von 0 für mich an. Ich dachte fill_value war nur für Zeilen mit fehlenden Daten oder NaNs? – ale19

+0

Ja Parameter fill_value Ersetze NaN auf 0. – jezrael

0

Wenn Sie dies tun möchten, ohne pivot_table zu verwenden, können Sie den folgenden Ansatz versuchen:

Wir machen im Wesentlichen einen Multi-Index aller möglichen Werte, multiplizieren die zwei Spalten und verwenden dann diesen Multi-Index, um Nullen in unseren Group-by-Datenrahmen zu füllen.

0

Schritt 1: Erstellen eines Datenrahmens, der die Zählung jeder Nicht-Null-Klasse in der Spalte zählt

count_df = df.groupby(['Symbol','Year']).size().reset_index(name='counts') 

Schritt 2 speichert: Jetzt pivot_table benutzen Sie die gewünschte Datenrahmen mit Zählungen sowohl für bestehende und nicht vorhandene Klassen.

df_final = pd.pivot_table(count_df, 
         index=['Symbol','Year'], 
         values='counts',        
         fill_value = 0, 
         dropna=False, 
         aggfunc=np.sum) 

Nun sind die Werte der Zählungen kann mit dem Befehl

list(df_final['counts']) 
-1

Sie als Liste extrahiert werden kann, verwenden:

df = df.groupby(['Symbol','Year']).count().unstack(fill_value=0).stack() 
print df 

Ausgang:

   Action 
Symbol Year   
AAPL 2001  2 
     2002  0 
BAC 2001  0 
     2002  2