Как получить итоговую сумму значений столбцов в сводной таблице Panda? - PullRequest
1 голос
/ 27 апреля 2020

Мне удалось создать сводную таблицу со следующим кодом, как показано ниже.

d = {'ID': [1,2,1,2,3], 'Month':["Apr-20","May-20","June-20","Apr-20","June-20"],'Value1':[12,23,15,45,34], 'Value2':[124,214,1234,1324,234], 'Value3':[124,214,1234,1324,234], 'Value4':[124,214,1234,1324,234]}
df = pd.DataFrame(d)

df_pvt =    pd.pivot_table(df, values=['Value1','Value2', 'Value3', 'Value4'],
                        index=['ID'],
                        columns=['Month'],
                        aggfunc=np.sum,
                        fill_value=0)

Я застрял, чтобы вычислить "Общая сумма стоимости" и Общая итоговая строка в соответствии с красной меткой на рисунке ниже. образ. Нужна ваша помощь. Я ожидаю выхода ниже.

enter image description here

1 Ответ

2 голосов
/ 27 апреля 2020

Здесь необходимо добавить еще один DataFrame после sum с MultiIndex, созданным MultiIndex.from_product:

df = df_pvt.sum(axis=1, level=0)
df.columns = pd.MultiIndex.from_product([['Total'], df.columns])

df_pvt = df_pvt.join(df)
print (df_pvt)
      Value1                Value2                Value3                 \
Month Apr-20 June-20 May-20 Apr-20 June-20 May-20 Apr-20 June-20 May-20   
ID                                                                        
1         12      15      0    124    1234      0    124    1234      0   
2         45       0     23   1324       0    214   1324       0    214   
3          0      34      0      0     234      0      0     234      0   

      Value4                 Total                       
Month Apr-20 June-20 May-20 Value1 Value2 Value3 Value4  
ID                                                       
1        124    1234      0     27   1358   1358   1358  
2       1324       0    214     68   1538   1538   1538  
3          0     234      0     34    234    234    234  

Если хотите выбрать один из новых добавленных столбцов, используйте кортеж:

print (df_pvt[('Total','Value1')])
ID
1    27
2    68
3    34
Name: (Total, Value1), dtype: int64

Другая идея - это изменение порядка новых уровней:

df = df_pvt.sum(axis=1, level=0)
df.columns = pd.MultiIndex.from_product([df.columns, ['Total'], ])

df_pvt = df_pvt.join(df)
print (df_pvt)
      Value1                Value2                Value3                 \
Month Apr-20 June-20 May-20 Apr-20 June-20 May-20 Apr-20 June-20 May-20   
ID                                                                        
1         12      15      0    124    1234      0    124    1234      0   
2         45       0     23   1324       0    214   1324       0    214   
3          0      34      0      0     234      0      0     234      0   

      Value4                Value1 Value2 Value3 Value4  
Month Apr-20 June-20 May-20  Total  Total  Total  Total  
ID                                                       
1        124    1234      0     27   1358   1358   1358  
2       1324       0    214     68   1538   1538   1538  
3          0     234      0     34    234    234    234  

#swapped order
print (df_pvt[('Value1','Total')])

Также возможно создание пустых строк уровней, но я думаю, что это сбивает с толку (потому что для выбора необходимо использовать пустая строка), поэтому предпочтите первое решение:

df = df_pvt.sum(axis=1, level=0)
df.columns = pd.MultiIndex.from_product(['Total Sum of ' + df.columns, ['']])

df_pvt = df_pvt.join(df)
print (df_pvt)
      Value1                Value2                Value3                 \
Month Apr-20 June-20 May-20 Apr-20 June-20 May-20 Apr-20 June-20 May-20   
ID                                                                        
1         12      15      0    124    1234      0    124    1234      0   
2         45       0     23   1324       0    214   1324       0    214   
3          0      34      0      0     234      0      0     234      0   

      Value4                Total Sum of Value1 Total Sum of Value2  \
Month Apr-20 June-20 May-20                                           
ID                                                                    
1        124    1234      0                  27                1358   
2       1324       0    214                  68                1538   
3          0     234      0                  34                 234   

      Total Sum of Value3 Total Sum of Value4  
Month                                          
ID                                             
1                    1358                1358  
2                    1538                1538  
3                     234                 234  

Для выбора необходимо также использовать пустую строку:

print (df_pvt[('Total Sum of Value1','')])
ID
1    27
2    68
3    34
Name: (Total Sum of Value1, ), dtype: int64
...