2016-05-03 21 views
7

Ho dati di questo tipo in un file CSVPanda groupby per i valori zero

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

io sono in grado di leggerlo e groupby come questo

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

ottengo

   Action 
Symbol Year   
AAPL 2001  2 
BAC 2002  2 

Lo desidero (l'ordine non ha importanza)

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

voglio sapere se il suo possibile contare per lo zero occorrenze

risposta

8

È possibile utilizzare pivot_table con 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 

Se avete bisogno di output come DataFrame uso to_frame:

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

Questo crea una bella tabella pivot ma usando fill_value = 0 continua a non farlo mostra le righe con un conteggio di 0 per me. Pensavo che fill_value fosse solo per le righe con dati mancanti o NaN? – ale19

+0

Sì parametro fill_value sostituire NaN a 0. – jezrael

0

Se si desidera eseguire questa operazione senza utilizzare pivot_table, è possibile provare l'approccio seguente:

midx = pd.MultiIndex.from_product([ df['Symbol'].unique(), df['Year'].unique()], names=['Symbol', 'Year']) 
df_grouped_by = df_grouped_by.reindex(midx, fill_value=0) 

Quello che stiamo essenzialmente facendo sopra è creare un multiindice di tutti i valori possibili moltiplicando le due colonne e quindi usando quel multiindice per riempire gli zero nel nostro gruppo per dataframe.

0

Passaggio 1: Creare un dataframe che memorizza il conteggio di ogni non-zero di classe nella colonna conta

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

Fase 2: ora utilizzare tabella_pivot per ottenere il dataframe desiderato con i conteggi per esistenti e classi non esistenti.

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

Ora i valori dei conti può essere estratto come un elenco con il comando

list(df_final['counts']) 
-1

È possibile utilizzare questo:

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

uscita:

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