J'ai une base de données contenant des transactions par jour sur une période de plusieurs années. Je voudrais convertir ce df en df_monthly où chaque ligne contient la somme des transactions d'un mois donné, arrangée du 1 (jan) 2019 au 2 (feb) 2020.
Supposons que ce soit mon df:
XXX
J'ai essayé ceci
year month col1 col2 0 2019 1 14 180 1 2019 2 48 82 2 2020 1 56 48 3 2020 2 8 2
output:
col1 col2 month year 1 2019 14 180 2020 56 48 2 2019 48 82 2020 8 2
Ce que je voudrais c'est ceci:
df['month'] = df.index.month df['year'] = df.index.year df_monthly = df.groupby(['month', 'year']).sum()
Avez-vous des suggestions?
merci!
3 Réponses :
'groupby' peut être utilisé.
df.groupby(['year','month']).agg(sum).reset_index() year month col1 col2 0 2019 1 14 180 1 2019 2 48 82 2 2020 1 56 48 3 2020 2 8 2
data = df_monthly.reset_index ()
print (data.sort_values (by = ['year']))
month year col1 col2 0 1 2019 14 180 2 2 2019 48 82 1 1 2020 56 48 3 2 2020 8 2
Effectuer un tri, réinitialiser l'index, réorganiser les colonnes:
year month col1 col2 0 2019 1 14 180 1 2019 2 48 82 2 2020 1 56 48 3 2020 2 8 2
Retour:
import pandas as pd df = pd.DataFrame([['2019-01-01', 11, 82], ['2019--01-02', 3, 98], ['2019-02-01', 1, 3], ['2019-02-02', 47, 79], ['2020-01-01', 56, 48], ['2020-02-02', 8, 2]], columns=['date', 'col1', 'col2']) df['date'] = pd.to_datetime(df['date']) df.set_index('date', inplace=True) # print(df) df['month'] = df.index.month df['year'] = df.index.year df_monthly = df.groupby(['month', 'year']).sum() df_monthly = df_monthly.sort_values(['year']).reset_index() cols = df_monthly.columns.tolist() # print(cols) cols = [cols[1]] + [cols[0]] + cols[2:] df_monthly = df_monthly[cols] print(df_monthly)
Je pense que changer le groupby en
df.groupby (['month', 'year']). Sum ()
devrait fonctionner.