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.