Если / еще с Python Pandas Dataframe - PullRequest
2 голосов
/ 16 апреля 2020

Извиняюсь за вопрос noob, но я борюсь с python условностями.

Имею следующий фрейм данных:

id  bonus
1   1.5
2   1.12
3   1.09
4   0.9
5   0.74
6   0.83

У меня есть верхний и нижний предел переменных:

upper_limit = 1.2
lower limit = 0.8

Попытка написать условие, которое: 1) Проверяет, находится ли бонус выше или ниже порогового значения. 2) Создает новый столбец, который гарантирует, что значение не будет go выше или ниже порогового значения. Если значение бонуса находится в пределах диапазона, оно не меняется.

Должно выглядеть так:

id  bonus   bonus_capped
1   1.5     1.2
2   1.12    1.12
3   1.09    1.09
4   0.9     0.9
5   0.74    0.8
6   0.83    0.83

Мой код:

conditions = [df["bonus"] > upper_limit, df["bonus"] < lower_limit]
choices = [upper_limit, lower_limit]

df["bonus_capped"] = np.select(conditions, choices)

print(df)

, но вывод I Получаю только исправляя одно условие и возвращая нули для остальных. Чего мне не хватает?

id  bonus   bonus_capped
1   1.5     0
2   1.12    0
3   1.09    0
4   0.9     0
5   0.74    0.8
6   0.83    0

Ответы [ 3 ]

3 голосов
/ 16 апреля 2020

Это будет легко, используя numpy.clip:

import numpy as np

df['bonus_capped'] = np.clip(df['bonus'], 0.8, 1.2)

, где 0,8 и 1,2 - ваш нижний и верхний пределы соответственно.

2 голосов
/ 16 апреля 2020

Используя метод, который вы пытались:

In [1100]: col         = 'bonus' 
      ...: conditions  = [ df['bonus'] < 0.8 , df['bonus'] > 1.2] 
      ...: choices     = [0.8, 1.2]                                                                                                                                                                         

In [1102]: df['bonus_capped'] = np.select(conditions, choices, default=df['bonus'])                                                                                                                         

In [1103]: df                                                                                                                                                                                               
Out[1103]: 
   id  bonus  bonus_capped
0   1   1.50          1.20
1   2   1.12          1.12
2   3   1.09          1.09
3   4   0.9           0.9
4   5   0.74          0.80
5   6   0.83          0.83
2 голосов
/ 16 апреля 2020

В pandas

upper_limit = 1.2
lower_limit = 0.8
df.bonus.clip(lower_limit,upper_limit)
0    1.20
1    1.12
2    1.09
3    0.90
4    0.80
5    0.83
Name: bonus, dtype: float64
#df.bonus=df.bonus.clip(lower_limit,upper_limit)
...