Панды, определить размер прибыли на основе классификации продуктов - PullRequest
0 голосов
/ 25 ноября 2018

У меня есть df с несколькими столбцами, индекс - product_code, а столбец фокуса - код NCM

Я хотел бы создать новый столбец (называемый Profit Margin) в этом фрейме данных, который определяет прибыльполе данного кода продукта на основе его кода NCM

Код NCM состоит из 8 цифр ...

Когда первое число из 8-значного числа равно 3, вновь созданный столбец вернется40%

Когда первые 2 цифры 45, вновь созданный столбец вернет 30%

Когда первые 3 цифры 565, новый столбец вернет 25%

Когда первые 4 цифры равны 1245, вновь созданный столбец вернет 20%

В противном случае он вернет 15%

Рассмотрим текущий упрощенный DF:

product_code   NCM code
    AA         30000000
    BB         45000000
    CC         56500000
    DD         12450000
    EE         99999999

Желаемый результат:

product_code   NCM code    Profit Margin
    AA         30000000        40%
    BB         45000000        30%
    CC         56500000        25%
    DD         12450000        20%
    EE         99999999        15%

Я попытался написать свою собственную функцию и с большим разочарованием подать заявку на создание нового столбца.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Еще короче, однострочник (даже это некрасиво): -):

df['Profit Margin']=df['NCM Code'].apply(lambda x: ['40%','30%','25%','20%','15%'][[str(x)[0]=='3',str(x)[:2]=='45',str(x)[:3]=='565',str(x)[:4]=='1245',True].index(True)])

Сделайте его более видимым:

df['Profit Margin']=df['NCM Code'].apply(
  lambda x: ['40%','30%','25%','20%','15%']
  [[str(x)[0]=='3',str(x)[:2]=='45',str(x)[:3]=='565',str(x)[:4]=='1245',True].index(True)])

А теперь:

print(df)

Is:

  product code  NCM Code Profit Margin
0           AA  30000000           40%
1           BB  45000000           30%
2           CC  56500000           25%
3           DD  12450000           20%
4           EE  99999999           15%

Так что, в основном, делайте хорошую индексацию логических списков в скобках применения.

0 голосов
/ 25 ноября 2018

Неловко, но не отменно:

import numpy as np
df['Profit Margin'] = np.where(df['NCM code'].str[0]=='8', 0.4,
                      np.where(df['NCM code'].str[:2]=='45', 0.3,
                      np.where(df['NCM code'].str[:3]=='565', 0.25,
                      np.where(df['NCM code'].str[:4]=='1245', 0.2, 0.15))))
#  product_code  NCM code  Profit Margin
#0           AA  30000000           0.15
#1           BB  45000000           0.30
#2           CC  56500000           0.25
#3           DD  12450000           0.20
#4           EE  99999999           0.15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...