【问题标题】:Python Pivot Table multi Sub-totals in columnPython数据透视表多列小计
【发布时间】:2021-02-12 17:20:08
【问题描述】:

我希望能够以不同的方式显示多索引数据透视表中的小计列,例如,我想显示选定行的总和和另一行的最大值,这可能吗?

我设法让一半代码正确,但我被困在复制代码而没有偏移前一个代码,我无法循环此代码。

在我的示例中,我想从新创建的 Total 列中获取 Toyota 的最大值和 Honda 的总和值。

cars = {'Brand': ['Honda','Toyota', 'Honda','Toyota'],
        'Target': ['A','B', 'A','B'],
        'Speed': [20, 80, 30 , 10],
        'Date' : ['13/02/2019', '18/02/2019', '18/02/2019', '13/02/2019']
       }

df = pd.DataFrame(cars)


table = pd.pivot_table(df, values=['Speed'],
                       index=['Target', 'Brand'],
                       columns=['Date'],
                       fill_value=0, aggfunc=np.sum, dropna=True)
table

创建的代码:(仅适用于最后一行,因为它会覆盖第一行)

table['Total'] = table.loc(axis=0)[:, ['Toyota']].max(axis=1)
table['Total'] = table.loc(axis=0)[:, ['Honda']].sum(axis=1)

当前输出:

不理想的输出:

我还希望能够看到 Toyota 的最大值为 80。

【问题讨论】:

    标签: python pandas loops pivot-table multi-index


    【解决方案1】:

    使用slicers在两边设置新值,这里:表示所有级别的值:

    idx = pd.IndexSlice
    table.loc[idx[:, 'Toyota'], 'Total'] = table.max(axis=1)
    table.loc[idx[:, 'Honda'], 'Total'] = table.sum(axis=1)
    print (table)
                       Speed            Total
    Date          13/02/2019 18/02/2019      
    Target Brand                             
    A      Honda          20         30  50.0
    B      Toyota         10         80  80.0
    

    两边都可以设置和选择:

    idx = pd.IndexSlice
    table.loc[idx[:, 'Toyota'], 'Total'] = table.loc[idx[:, 'Toyota'], :].max(axis=1)
    table.loc[idx[:, 'Honda'], 'Total'] = table.loc[idx[:, 'Honda'], :].sum(axis=1)
    

    【讨论】:

      猜你喜欢
      • 2015-01-21
      • 2021-11-03
      • 2013-03-12
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 2017-05-13
      • 2013-07-13
      • 1970-01-01
      相关资源
      最近更新 更多