根据多个条件创建列

时间:2018-03-09 01:01:59

标签: python pandas dataframe nested

我是一位长期尝试进入Pandas的SAS用户。我想根据各种if条件设置列的值。我想我可以使用嵌套的np.where命令来做到这一点,但我想我会检查是否有更优雅的解决方案。例如,如果我设置左边界和右边界,并且想要返回一列字符串值,如果x是这些边界的左边,中间或右边,那么最好的方法是什么?基本上如果x< lbound return" left",否则如果lbound< x< rbound return" middle&#34 ;,否则如果x> rbound return" 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 ifs。

输出应为:

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

2 个答案:

答案 0 :(得分:2)

选项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可能会更方便。

答案 1 :(得分:2)

您可以使用numpy select而不是np.where

def convAlph2Num(sent):
    alphArray = list(string.ascii_lowercase)
    alphSet = set(alphArray)
    sentArray = list(sent.lower())
    x = []
    for u in sentArray:
        if u in alphSet:
            u = alphArray.index(u) + 1
            x.append(u)
    print(x)
    return