панды, сравнивающие значение столбца с 0 - PullRequest
2 голосов
/ 27 сентября 2019

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

data = {'sc':['a','a','a','a','b','b','b','b'],
    't1':['O','O','O','X','O','X','O','O'],
    'q1':[10,15,12,12,14,15,16,9],
    's1':[280,310,292,245,267,288,291,298],
    's2':[290,315,294,247,268,285,290,296],
    }
df=pd.DataFrame(data)
df

   sc   t1  q1  s1  s2
0   a   O   10  280 290
1   a   O   15  310 315
2   a   O   12  292 294
3   a   X   12  245 247
4   b   O   14  267 268
5   b   X   15  288 285
6   b   O   16  291 290
7   b   O   9   298 296

Я хочу создать новый столбец "s3" на основе условий

data['s3']=max(s1-s2,0) where t1="O" and
data['s3']=max(q1,14) where t1="X"

Можете ли вы помочь PL?

1 Ответ

3 голосов
/ 27 сентября 2019

Мы можем использовать np.where [numpy-doc] здесь:

import numpy as np

df['s3'] = np.where(
    df['t1'] == 'O',
    df['s1'].sub(df['s2']).clip(lower=0),
    df['q1'].clip(lower=14)
)

Это дает:

>>> df
  sc t1  q1   s1   s2  s3
0  a  O  10  280  290   0
1  a  O  15  310  315   0
2  a  O  12  292  294   0
3  a  X  12  245  247  14
4  b  O  14  267  268   0
5  b  X  15  288  285  15
6  b  O  16  291  290   1
7  b  O   9  298  296   2

Если s3 уже существует, мы можем использовать np.select вместо:

df['s3'] = np.select(
    [df['t1'] == 'O', df['t1'] == 'X'],
    [
       df['s1'].sub(df['s2']).clip(lower=0),
       df['q1'].clip(lower=14)
    ],
    default=df['s3']
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...