【问题标题】:Pivot table summation of "values" with respect to "columns"关于“列”的“值”的数据透视表总和
【发布时间】:2021-06-29 16:42:07
【问题描述】:

我对 pandas 很陌生,目前不确定是否可以使用 margin=True 对列的值求和而不是一次性总和。目前,我已使用 Microsoft Excel 的数据透视表功能作为参考构建了此表。

代码如下:

import pandas as pd
import numpy as np

data = {
    'company_country': ['C1', 'C1', 'C2', 'C2',  'C3',  'C4',  'C4'],
    'Company': ['Company1', 'Company2', 'Company3', 'Company4', 'Company5', 'Company6', 'Company7'],
    'Sales': [10, 20, 30, 40, 50 , 60, 70],
    'Gross Margin': [40, 50, 60, 70, 80, 90, 100],
    'invoice_date': ['Week1', 'Week1', 'Week2', 'Week2', 'Week3', 'Week4', 'Week4'],
    'Account_code': ['3P', 'Inter-company', '3P', 'Inter-company', 'Inter-company', '3P', 'Inter-company']
}

df = pd.DataFrame(data,
                  columns=['company_country',
                           'Company',
                           'Sales',
                           'Gross Margin',
                           'invoice_date',
                           'Account_code'
                           ]
                  )
data_summarised = pd.pivot_table(df, index=["company_country", "Company"],
                                 values=["Sales", "Gross Margin"],
                                 columns=["invoice_date", "Account_code"],
                                 aggfunc=[np.sum],
                                 fill_value=0,
                                 margins=True)
data_summarised.columns = data_summarised.columns.droplevel(0)
data_summarised.columns = data_summarised.columns.swaplevel(0, 1)
data_summarised.columns = data_summarised.columns.swaplevel(1, 2)

print(data_summarised)

输出是:

invoice_date                    Week1                ...         Week4   All
Account_code                       3P Inter-company  ... Inter-company      
                         Gross Margin  Gross Margin  ...         Sales Sales
company_country Company                              ...                    
C1              Company1           40             0  ...             0    10
                Company2            0            50  ...             0    20
C2              Company3            0             0  ...             0    30
                Company4            0             0  ...             0    40
C3              Company5            0             0  ...             0    50
C4              Company6            0             0  ...             0    60
                Company7            0             0  ...            70    70
All                                40            50  ...            70   280

[8 rows x 16 columns]

Process finished with exit code 0

问题: 是否可以在此表中添加列名称为“3P 销售额总和”、“公司间销售额总和”、“3P 毛利率总和”和“公司间毛利率总和”的列,而不仅仅是总销售额和毛利率?

提前感谢您的帮助!

【问题讨论】:

    标签: pandas pivot-table


    【解决方案1】:

    您可以将 MultiIndex 每秒和第三级的值相加,为相同数量的级别添加第三级,例如 data_summarised

    df = data_summarised.sum(level=[1,2], axis=1).drop('', axis=1, level=0)
    
    df.columns = pd.MultiIndex.from_tuples([('Sum', *x) for x in df.columns])
    print (df)
                                      Sum                                  
                                       3P Inter-company    3P Inter-company
                             Gross Margin  Gross Margin Sales         Sales
    company_country Company                                                
    C1              Company1           40             0    10             0
                    Company2            0            50     0            20
    C2              Company3           60             0    30             0
                    Company4            0            70     0            40
    C3              Company5            0            80     0            50
    C4              Company6           90             0    60             0
                    Company7            0           100     0            70
    All                               190           300   100           180
    

    然后添加到原来的:

    data_summarised = df.join(data_summarised).sort_index(axis=1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      相关资源
      最近更新 更多