Создание промежуточных итогов для строк в сводной таблице для разных столбцов - PullRequest
0 голосов
/ 07 июня 2018

Я создаю сводную таблицу с помощью Pandas, но на некоторое время застрял в промежуточных итогах для строк в разных столбцах (с одинаковыми значениями). Я провел некоторое исследование стекового потока, такого как Промежуточные суммы строк в сводных таблицах Pandas. и это Промежуточные итоги для индекса сводной таблицы Pandas и столбца (на самом деле этот пример близок, но кое-что также отличается от моего случая), но не нашел правильной подсказки для моего случая, поэтому, пожалуйста, для этоготема, спасибо.

Здесь я приведу упрощенный DataFrame (оригинальный размер слишком велик, чтобы показывать здесь, поэтому их значения действительно не имеют значения, формат - это то, что я ищу) моего случая и кодаЯ написал для получения моей сводной таблицы.

import pandas as pd
import numpy as np
df = pd.DataFrame(
{
    'Co':['NN']*6,
    'Op':['A','B']*3,
    'Stk':[1.1,1.2,1.3]*2,
    'Tm':['07-01-2018','08-01-2018','09-01-2018']*2,
    'Qt':[100,200,300]*2
}
)
df

Вывод df выглядит следующим образом:

Co  Op  Qt  Stk Tm
0   NN  A   100 1.1 07-01-2018
1   NN  B   200 1.2 08-01-2018
2   NN  A   300 1.3 09-01-2018
3   NN  B   100 1.1 07-01-2018
4   NN  A   200 1.2 08-01-2018
5   NN  B   300 1.3 09-01-2018

Затем я преобразую выше df в свою сводную таблицу:

df['Qt'] = df['Qt'].apply(pd.to_numeric)
df['Stk']=df['Stk'].apply(pd.to_numeric)
df['Co'] = df['Co'].astype(str)
tb=pd.pivot_table(df,index=["Tm"],columns=["Co","Op","Stk"],aggfunc=np.sum,values=['Qt'], fill_value=0, margins=True, margins_name='All')
tb

Сгенерированная сводная таблица выглядит следующим образом:

            Qt
Co          NN                              All
Op          A              B    
Stk         1.1  1.2  1.3  1.1  1.2  1.3    
        Tm                          
07-01-2018  100  0    0    100  0    0      200
08-01-2018  0    200  0    0    200  0      400
09-01-2018  0    0    300  0    0    300    600
       All  100  200  300  100  200  300    1200

Формат, который я действительно ожидаю, таков:

            Qt
Co          NN                                                All
Op          A              ATotal   B               BTotal
Stk         1.1  1.2  1.3           1.1  1.2  1.3   
        Tm                          
07-01-2018  100  0    0    100      100  0    0     100       200
08-01-2018  0    200  0    200      0    200  0     200       400
09-01-2018  0    0    300  300      0    0    300   300       600
       All  100  200  300  600      100  200  300   600       1200

Я пытался создать этот точно такой же формат некоторое время и до сих пор могу'не получить тот же (я пробовал что-то вроде создания двух отдельных сводных таблиц A и B и объединения их вместе, но это будет мешать со всеми полями).Так что помощь здесь действительно нужна.ps Я все еще новичок в сообществе stackoverflow, поэтому извините, если в моем вопросе отсутствуют некоторые аспекты, спасибо.

1 Ответ

0 голосов
/ 07 июня 2018

pivot_table не поддерживает его, но вы можете вычислить его самостоятельно и объединить позже:

tb.groupby(level='Op', axis=1).sum().add_suffix('Total')

Op          Total  ATotal  BTotal
Tm                               
07-01-2018    200     100     100
08-01-2018    400     200     200
09-01-2018    600     300     300
All          1200     600     600
...