熊猫数据透视表中的小计

Posted

技术标签:

【中文标题】熊猫数据透视表中的小计【英文标题】:Sub Total in pandas pivot Table 【发布时间】:2017-06-18 03:58:27 【问题描述】:

我喜欢根据组进行小计,所以它不会干扰总计,

代码是

import pandas as pd
import numpy as np
dict_data = ['duration': 0.7, 'project_id': 3, 'resource': u'Arya Stark', 'activity': u'Development',
'duration': 0.9, 'project_id': 4, 'resource': u'Ned Stark', 'activity': u'Development',
'duration': 2.88, 'project_id': 7, 'resource': u'Robb Stark', 'activity': u'Development',
'duration': 0.22, 'project_id': 9, 'resource': u'Jon Snow', 'activity': u'Support',
'duration': 0.3, 'project_id': 9, 'resource': u'Jon Snow', 'activity': u'Support',
'duration': 2.15, 'project_id': 3, 'resource': u'Arya Stark', 'activity': u'Practise',
'duration': 3.35, 'project_id': 4, 'resource': u'Sansa Stark', 'activity': u'Development',
'duration': 2.17, 'project_id': 9, 'resource': u'Rickon Stark', 'activity': u'Development',
'duration': 1.03, 'project_id': 4, 'resource': u'Benjan Stark', 'activity': u'Design',
'duration': 1.77, 'project_id': 4, 'resource': u'Bran Stark', 'activity': u'Testing',
'duration': 1.17, 'project_id': 4, 'resource': u'Ned Stark', 'activity': u'Development',
'duration': 0.17, 'project_id': 9, 'resource': u'Jon Snow', 'activity': u'Support',
'duration': 1.77, 'project_id': 3, 'resource': u'catelyn stark', 'activity': u'Development',
'duration': 0.3, 'project_id': 9, 'resource': u'Jon Snow', 'activity': u'Support',
'duration': 0.45, 'project_id': 9, 'resource': u'Jon Snow', 'activity': u'Support']
df = pd.DataFrame(dict_data)
pvt = pd.pivot_table(df, values=['duration'],index=['project_id','resource'], columns=['activity'], aggfunc=np.sum,margins=True, fill_value=0)

所以我期待如下模式的输出:

问题是我无法将小计行追加到表格中

【问题讨论】:

您想只在第一组中小计,还是在index 中按MultiIndex 的第一级对每个组进行小计? 第一级的每个组 但我可以在单独的表中求和,但我未能将其附加到源表中并使用小计@jezrael 【参考方案1】:

通过unstack 重塑以使用sum 创建新的最后一行subtotal,但需要过滤掉所有All 列。然后stackswaplevelsort_index。列已排序,因此按子集将All 列置于最后位置:

pvt = pvt.unstack(0)
mask = pvt.columns.get_level_values('project_id') != 'All'
#print (mask)
pvt.loc['subtotal'] = pvt.loc[:, mask].sum()
pvt = pvt.stack().swaplevel(0,1).sort_index()
pvt = pvt[pvt.columns[1:].tolist() + pvt.columns[:1].tolist()]
print (pvt)
                         duration                                            
activity                   Design Development Practise Support Testing    All
project_id resource                                                          
3          Arya Stark        0.00        0.70     2.15    0.00    0.00   2.85
           catelyn stark     0.00        1.77     0.00    0.00    0.00   1.77
           subtotal          0.00        2.47     2.15    0.00    0.00   4.62
4          Benjan Stark      1.03        0.00     0.00    0.00    0.00   1.03
           Bran Stark        0.00        0.00     0.00    0.00    1.77   1.77
           Ned Stark         0.00        2.07     0.00    0.00    0.00   2.07
           Sansa Stark       0.00        3.35     0.00    0.00    0.00   3.35
           subtotal          1.03        5.42     0.00    0.00    1.77   8.22
7          Robb Stark        0.00        2.88     0.00    0.00    0.00   2.88
           subtotal          0.00        2.88     0.00    0.00    0.00   2.88
9          Jon Snow          0.00        0.00     0.00    1.44    0.00   1.44
           Rickon Stark      0.00        2.17     0.00    0.00    0.00   2.17
           subtotal          0.00        2.17     0.00    1.44    0.00   3.61
All                          1.03       12.94     2.15    1.44    1.77  19.33

【讨论】:

以上是关于熊猫数据透视表中的小计的主要内容,如果未能解决你的问题,请参考以下文章

从 R 中的数据透视表库呈现的数据透视表中删除小计和总计

您可以对数据透视表中的行和/或列进行小计吗?

数据透视表中每个级别的小计

如何组合熊猫数据透视表中的列?

如何删除熊猫数据透视表中的多级索引

熊猫:从数据透视表中的另一列中减去一列