web-dev-qa-db-fra.com

Pandas groupby pour les valeurs nulles

J'ai des données comme celle-ci dans un fichier csv

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

Je peux le lire et grouper comme ça

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

Je reçois

             Action
Symbol Year        
AAPL   2001       2
BAC    2002       2

Je le désire (l'ordre n'a pas d'importance)

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

Je veux savoir s'il est possible de compter pour zéro occurrence

20
NinjaGaiden

Vous pouvez utiliser pivot_table avec 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

Si vous avez besoin d'une sortie en tant que DataFrame utilisez 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
17
jezrael

Vous pouvez utiliser ceci:

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

Production:

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

Si vous souhaitez le faire sans utiliser pivot_table, vous pouvez essayer l'approche ci-dessous:

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)

Ce que nous faisons essentiellement ci-dessus est de créer un multi-index de toutes les valeurs possibles en multipliant les deux colonnes, puis en utilisant ce multi-index pour remplir des zéros dans notre trame de données groupée.

0
Punit S

Étape 1: créer une trame de données qui stocke le nombre de chaque classe non nulle dans la colonne nombre

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

Étape 2: utilisez maintenant pivot_table pour obtenir la trame de données souhaitée avec le nombre de classes existantes et non existantes.

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

Maintenant, les valeurs des comptes peuvent être extraites sous forme de liste avec la commande

list(df_final['counts'])
0
Anjul Tyagi