Расчет процента панд с использованием двух информационных фреймов - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь рассчитать процент продаж, используя общий объем продаж для каждого мультииндекса. Мой DataFrame выглядит так:

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

Итак, я вычисляю общие продажи для каждого уникального кортежа в индексе и сохраняю их в виде общего фрейма данных. Моя цель - рассчитать каждую рыночную долю, но сейчас я стремлюсь к TEPOS. После поворота мой DataFrame стал примерно таким:

                                       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

Код, который я использую для вычисления итога и создания кадра данных с мультииндексом:

#creating a sample from all data

a = df.sample(n=50)

#creating a multiindex dataframe

temp_df = pd.pivot_table(a.fillna(value=0), index=['tipo','local','pacote'],columns=['fabricante'], values=['vendas_kg'], fill_value=0, aggfunc=[np.sum])
total = temp_df.sum(level=1, axis=1)

#calculating the marketshare for Tepos

temp_df[('sum','vendas_kg','TEPOS')] = temp_df[('sum','vendas_kg','TEPOS')] / temp_df.sum(level=1, axis=1)

Происходит две вещи: если я использую все столбцы, все данные становятся NaN, если я использую приведенный выше код.

ValueError: cannot join with no level specified and no overlapping names

Моя цель - сделать что-то вроде этого:

                                       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

Кто-нибудь может мне помочь? Для получения дополнительной информации о данных и целях: Расчет процента в пандах сводной таблицы со столбцами

1 Ответ

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

попробуйте это:

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

                            sum
                            vendas_kg
              fabricante    ASATP   TEPOS
tipo    local   pacote      
CAPSULA AREA I  PLASTICO    40.00   60.00
        AREA II PLASTICO    22.73   77.27
DILUIDO AREA I  PLASTICO    37.50   62.50
        AREA II PLASTICO    42.86   57.14

Чтобы добавить столбец total, выполните:

df_percent['total'] = total

Объяснение

apply эквивалентен циклу, а команда axis сообщает приложению, что он свернет в столбцы.Код выполняет только взятие каждого значения строки и деление на сумму всей строки.Способ, который я реализовал, работает только до добавления других столбцов, таких как total

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...