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
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
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
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.
É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'])