基于多个条件创建列

5

我是一名长期使用SAS的用户,现在想学习Pandas。我想根据各种条件设置列的值。我认为可以使用嵌套的np.where命令来实现,但我想确认是否有更优雅的解决方案。例如,如果我设置左边界和右边界,并希望返回一个字符串值的列,以表示x是否在这些边界的左侧、中间或右侧,那么最好的方法是什么?基本上,如果 x < 左边界,则返回“left”,如果左边界 < x < 右边界,则返回“middle”,否则如果 x > 右边界,则返回“right”。

df
   lbound   rbound  x
0   -1      1       0
1   5       7       1
2   0       1       2

可以使用np.where检查一个条件:

df['area'] = np.where(df['x']>df['rbound'],'right','somewhere else')

但不确定该怎么做,如果我想在单行中检查多个 if-else if 语句。

输出应该是:

df
   lbound   rbound  x    area
0   -1      1       0    middle
1   5       7       1    left
2   0       1       2    right
2个回答

6

选项1

您可以使用嵌套的np.where语句。例如:

df['area'] = np.where(df['x'] > df['rbound'], 'right', 
                      np.where(df['x'] < df['lbound'],
                               'left', 'somewhere else'))

选项 2

您可以使用 .loc 访问器来分配特定的范围。请注意,在使用之前,您将需要添加新列。我们借此机会设置默认值,该默认值可能会在以后被覆盖。

df['area'] = 'somewhere else'
df.loc[df['x'] > df['rbound'], 'area'] = 'right'
df.loc[df['x'] < df['lbound'], 'area'] = 'left'

说明

这两种方法都是有效的替代方案,性能相当。在这两个实例中,计算都是矢量化的。我更喜欢选项2,因为它似乎更易读。如果有大量嵌套条件,则np.where可能更方便。


2
您可以使用numpy的select替代np.where。
cond = [df['x'].between(df['lbound'], df['rbound']), (df['x'] < df['lbound']) , df['x'] > df['rbound'] ]
output = [ 'middle', 'left', 'right']

df['area'] = np.select(cond, output, default=np.nan)



    lbound  rbound  x   area
0   -1      1       0   middle
1   5       7       1   left
2   0       1       2   right

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接