Можно преобразовать значения серии в метки столбцов и затем groupby
:
df = pd.pivot_table(df, index=df.index, columns='Category', values='Amount')\
.groupby(pd.Grouper(freq='M')).sum().fillna(0)
print(df)
Category Auto Dining Gas Groceries Medical
2018-11-30 0.0 0.0 0.0 0.0 100.0
2018-12-31 25.0 14.0 50.0 100.0 0.0
Вы также можете выполнить вышеуказанные операции с помощьюкросс-табуляция:
df = pd.crosstab(df.index.to_period('M'), columns=df['Category'],
values=df['Amount'], aggfunc='sum').fillna(0).rename_axis(None)
print(df)
Category Auto Dining Gas Groceries Medical
2018-11 0.0 0.0 0.0 0.0 100.0
2018-12 25.0 14.0 50.0 100.0 0.0
Настройка
df = pd.DataFrame({'Amount': [100.0, 50.0, 25.0, 14.0, 100.0],
'Category': ['Groceries', 'Gas', 'Auto', 'Dining', 'Medical'],
'Description': ['Stop&Shop', 'Shell', 'NYCParking', 'TonysPizza', 'DrJones']},
index=pd.to_datetime(['2018-12-03', '2018-12-03', '2018-12-02', '2018-12-01', '2018-11-30']))