基于列条件

时间:2018-03-27 14:33:51

标签: python pandas

     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

3 个答案:

答案 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