熊猫将列值与0进行比较

时间:2019-09-27 19:12:10

标签: pandas

我有以下数据框

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"

您能帮忙吗?

1 个答案:

答案 0 :(得分:3)

我们可以在此处使用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']
)