Расчет процента в сводных таблицах панд с колоннами - PullRequest
2 голосов
/ 21 марта 2019

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

local   categoria   fabricante   tipo      consistencia    peso         pacote   ordem vendas_kg
AREA I  SABAO       ASATP        DILUIDO   LIQUIDO         1501 A 2000g PLASTICO 1    10
AREA I  SABAO       TEPOS        DILUIDO   LIQUIDO         1501 A 2000g PLASTICO 1    20
AREA I  SABAO       ASATP        CAPSULA   LIQUIDO         1501 A 2000g PLASTICO 1    20
AREA I  SABAO       TEPOS        CAPSULA   LIQUIDO         1501 A 2000g PLASTICO 1    30
AREA I  SABAO       ASATP        DILUIDO   LIQUIDO         1501 A 2000g PLASTICO 2    20
AREA I  SABAO       TEPOS        DILUIDO   LIQUIDO         1501 A 2000g PLASTICO 2    30
AREA I  SABAO       ASATP        CAPSULA   LIQUIDO         1501 A 2000g PLASTICO 2    20
AREA I  SABAO       TEPOS        CAPSULA   LIQUIDO         1501 A 2000g PLASTICO 2    30
AREA II SABAO       ASATP        DILUIDO   LIQUIDO         1501 A 2000g PLASTICO 1    10
AREA II SABAO       TEPOS        DILUIDO   LIQUIDO         1501 A 2000g PLASTICO 1    15
AREA II SABAO       ASATP        CAPSULA   LIQUIDO         1501 A 2000g PLASTICO 1    25
AREA II SABAO       TEPOS        CAPSULA   LIQUIDO         1501 A 2000g PLASTICO 1    35
AREA II SABAO       ASATP        DILUIDO   LIQUIDO         1501 A 2000g PLASTICO 2    20
AREA II SABAO       TEPOS        DILUIDO   LIQUIDO         1501 A 2000g PLASTICO 2    25
AREA II SABAO       TEPOS        CAPSULA   LIQUIDO         1501 A 2000g PLASTICO 2    20
AREA II SABAO       TEPOS        CAPSULA   LIQUIDO         1501 A 2000g PLASTICO 2    30

Я поворачиваю этот набор данных, используя следующий код:

temp_df = pd.pivot_table(df,index=['local','tipo','ordem'], values=['vendas_kg'] , aggfunc=[np.sum], columns=['fabricante'], fill_values=0, margins=True, margins_name= 'Total')

и получаю этот вывод:

                                       sum           sum
                                 vendas_kg     vendas_kg
fabricante                           ASATP         TEPOS      Total
local          tipo      ordem 
AREA I         DILUIDO     1          10            20         30
                           2          20            30         50
               CAPSULA     1          10            20         30
                           2          20            30         50
AREA II        DILUIDO     1          10            15         25
                           2          20            25         45
               CAPSULA     1          25            35         55
                           2          20            30         50

Я хочу рассчитать процент для каждого ['ordem'] и для процента для каждого сегмента.ordem, tipo и local, например:

                                       sum           sum
                                 vendas_kg     vendas_kg
fabricante                           ASATP         TEPOS     % segment  Total
local          tipo      ordem 
AREA I         DILUIDO     1          33%            66%         50%     30
                           2          40%            60%         50%     50
               CAPSULA     1          33%            66%         50%     30
                           2          40%            60%         50%     50
AREA II        DILUIDO     1          40%            60%        31.25%   25
                           2         44.44%         55.56%      47.37%   45
               CAPSULA     1         43.64%         57.36%      53.63%   55
                           2          40%            60%        53.63%   50

Таким образом, общий объем продаж для AREA I DILUIDO 1 составляет 30, продажи ASATP составляют 33%, TEPOS - 66%, а общие продажи AREA I -1 продажи DILUIDO составляют 50% и т. Д.

Я также хочу сравнить разницу продаж между ['ordem'], например, процентным ростом сегмента и ['fabricante'], и сохранить в новой таблице, подобной этой:

                               % change in   % change in
                                 vendas_kg     vendas_kg   % change in  % change in
fabricante                           ASATP         TEPOS     % segment        Total
AREA I  DILUIDO 1                      0             0          0                 0                 
                2                     +7%           -6%         0                20
                3                      0             0          0                 0
AREA I  CAPSULA 1                      0             0          0                 0 
                2                     +7%           -6%         0                20
                3                      0             0          0                 0
AREA II DILUIDO 1                      0             0          0                 0 
                2                    +4.44%        -4.44%    +16.12%             20
                3                      0             0          0                 0
AREA II CAPSULA 1                      0             0          0                 0  
                2                    -3.64%        +3.64%          0              5
                3                      0             0          0                 0

Я застрял в этом за последние 5 дней, у меня есть гораздо больше категорий в ['fabricante'] ['tipo'] и ['local'], поэтому он должен работать для большего количествачем две категории в каждой.Заранее спасибо за помощь, не стесняйтесь обращаться ко мне в случае сомнений.

1 Ответ

1 голос
/ 25 марта 2019

Чтобы взять проценты:

df_percent = temp_df.iloc[:, [0,1]].apply(lambda x: round(x / x.sum() * 100, 2), axis = 1)

, чтобы взять вариацию, используйте diff

df_diff_percent = df_percent.groupby(level=[0,1]).diff().fillna(0)

                    sum
                    vendas_kg
      fabricante    ASATP   TEPOS
local   tipo    ordem       
AREA I  CAPSULA 1   0.00    0.00
                2   0.00    0.00
DILUIDO         1   0.00    0.00
                2   6.67    -6.67
AREA II CAPSULA 1   0.00    0.00
                2   -41.67  41.67
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...