Python np.select не подчиняется моим условиям, почему? - PullRequest
0 голосов
/ 07 мая 2019

У меня есть эта часть кода:

title = "Margin with minimal market price"

active_prods[title] = (active_prods['market min'] - active_prods['cost']) / active_prods['market min']

conditions = [
    (active_prods[title] < 0),
    (active_prods[title] >= 0) & (active_prods[title] <= 5),
    (active_prods[title] > 5) & (active_prods[title] <= 10)]
choices = ['1) <0', '2) <=5%', '3) <=10%']
active_prods['Margin type'] = np.select(conditions, choices, default='4) >10%')

Короче говоря - я пытаюсь рассчитать маржу моего продукта и дать ему некоторый тип в зависимости от того, где в интервале он находится. Мой код правильно устанавливает все поля <0, но все, что выше или равно нулю, настроено на второй параметр: </p>

2) <= 5% </p>

Каким-то образом он принимает только первую часть второго условия (то есть> = 0) и полностью игнорирует вторую часть условия. Третье условие также полностью игнорируется. Почему это происходит?

Active_prods - кадр данных для панд.

Ответы [ 2 ]

1 голос
/ 07 мая 2019

Предполагая, что active_prods является массивом Numpy, я думаю, что ваш & неверен для объединения логических массивов.

Возможно, вы хотите:

np.logical_and(active_prods[title] >= 0, active_prods[title] <= 5)
0 голосов
/ 07 мая 2019

вот еще один способ добиться этого. Вы можете использовать корзину и нарезать ассортимент на корзины. см. макет ниже:

import pandas as pd
active_prods = pd.DataFrame({'Margin':[0,-2,4,10,35,1,54]})
bins= [-100,0,6,11,100]
labels = ['1) <0','2) <=5%','3) <=10%','4) >10%']
active_prods['MarginType'] = pd.cut(active_prods['Margin'], bins=bins, labels=labels, right=False)
active_prods

см. Результат ниже:

Margin  MarginType
0   0   2) <=5%
1   -2  1) <0
2   4   2) <=5%
3   9   3) <=10%
4   35  4) >10%
5   1   2) <=5%
6   54  4) >10%
...