Измените первый список на новый индекс по столбцам Date
и Month
, добавьте Sales
к values
, добавьте статистическую функцию и укажите имя столбца общего столбца:
df = pd.crosstab(index=[df_train.Date,df_train.Month],
columns=df_train.ProductCategory,
values=df_train.Sales,
aggfunc='sum',
margins=True,
margins_name='Total Sales')
print (df)
ProductCategory Clothing Grossery Toys Total Sales
Date Month
1/1/2009 2009-Jan 1755.0 524.0 936.0 3215.0
2/1/2009 2009-Feb 1729.0 496.0 0.0 2225.0
Total Sales 3484.0 1020.0 936.0 5440.0
При необходимостиудалите последнюю строку и преобразуйте MultiIndex
в столбцы:
df = df.iloc[:-1].reset_index().rename_axis(None, axis=1)
print (df)
Date Month Clothing Grossery Toys Total Sales
0 1/1/2009 2009-Jan 1755.0 524.0 936.0 3215.0
1 2/1/2009 2009-Feb 1729.0 496.0 0.0 2225.0
Решение с pivot_table
без margins
:
df = df_train.pivot_table(index=['Date','Month'],
columns='ProductCategory',
values='Sales', aggfunc='sum')
df['Total Sales'] = df.sum(axis=1)
df = df.reset_index().rename_axis(None, axis=1)
print (df)
Date Month Clothing Grossery Toys Total Sales
0 1/1/2009 2009-Jan 1755.0 524.0 936.0 3215.0
1 2/1/2009 2009-Feb 1729.0 496.0 0.0 2225.0
И решение с margins
:
df = df_train.pivot_table(index=['Date','Month'],
columns='ProductCategory',
values='Sales',
aggfunc='sum',
margins=True,
margins_name='Total Sales')
print (df)
ProductCategory Clothing Grossery Toys Total Sales
Date Month
1/1/2009 2009-Jan 1755.0 524.0 936.0 3215.0
2/1/2009 2009-Feb 1729.0 496.0 0.0 2225.0
Total Sales 3484.0 1020.0 936.0 5440.0
df = df.iloc[:-1].reset_index().rename_axis(None, axis=1)