a b
0 100 90
1 30 117
2 90 99
3 200 94
我想创建一个包含下一个条件的新df["c"]
:
如果 b 进入(a±0.5a),那么 c = a
如果 b 不在(a±0.5a),那么 c = b
输出应为:
a b c
0 100 90 100
1 30 117 117
2 90 99 90
3 200 94 94
答案 0 :(得分:2)
我认为numpy.where
需要使用eval
创建的条件或&
或between
的链式条件:
df['c'] = np.where(df.eval("0.5 * a <= b <= 1.5 * a"), df.a, df.b)
#alternative 1
#df['c'] = np.where((df['b'] >= df.a.mul(1.5)) & (df['b'] <= df.a.mul(0.5)), df.a, df.b)
#alternative 2
#df['c'] = np.where(df['b'].between(df.a.mul(0.5), df.a.mul(1.5)), df.a, df.b)
print (df)
a b c
0 100 90 100
1 30 117 117
2 90 99 90
3 200 94 94
答案 1 :(得分:2)
你在这里只需要where
,你也可以将两个条件视为一个,所以我们只需要一次if - else(这是where
)逻辑
df['c']=df['a']
df.c=df.c.where((df.a*1.5>df.b)&(df.a*0.5<df.b),df.b)
df
Out[746]:
a b c
0 100 90 100
1 30 117 117
2 90 99 90
3 200 94 94
答案 2 :(得分:0)
这是使用.loc
访问者和pd.Series.between
的一种方法。
df['c'] = df['b']
df.loc[df['b'].between(0.5*df['a'], 1.5*df['a']), 'c'] = df['a']
<强>结果强>
a b c
0 100 90 100
1 30 117 117
2 90 99 90
3 200 94 94
<强>解释强>
.loc
进行更新。numpy.where
。