np.where()或新的pandas dataframe列的另一种布尔方式

时间:2016-10-20 20:24:34

标签: python pandas numpy

我想在数据框架中创建一个列,其中股票价格取决于另一个计算的布尔值。

              close    high   low
    Index
      0        10       11     10
      1        11       12     10
      2        10       11      9

首先,我想定义一些逻辑上看起来像这样的条件,但实际上是一个很长的条件:

 condition1: if df.close > df.close.shift() return True

实际上我想要定义更多条件,这些条件都是真或假的。然后我将它包含在np.where():

 df['NewColumn'] = np.where(condition1() == True, 'A', 'B')

我尝试将条件定义为函数,但无法正确设置它。我想避免将条件的内容直接写入np.where(),因为它会因几个嵌套条件而变得过于复杂。

那么,我怎样才能最有效地完成任务呢?

编辑:一个函数看起来像这样(但它在上面的np.where()中不起作用):

def condition1(): 
    if df.Close > df.Close.shift(1):
        return True
    Else
        return False

1 个答案:

答案 0 :(得分:1)

更新: IMO您不需要“条件”作为功能:

In [89]: cond1 = df.Close > df.Close.shift(1)

In [90]: cond2 = df.High < 12

In [91]: df['New_Close'] = np.where(cond1, 'A', 'B')

In [92]: df
Out[92]:
   Close  High  Low New_Close
0     10    11   10         B
1     11    12   10         A
2     10    11    9         B

In [93]: df['New_High'] = np.where(cond1, '<12', '>=12')

In [94]: df
Out[94]:
   Close  High  Low New_Close New_High
0     10    11   10         B     >=12
1     11    12   10         A      <12
2     10    11    9         B     >=12

OLD回答:

我真的没有看到这种方法的任何优点(好处),但你可以这样做:

def condition1(): 
    return (df.Close > df.Close.shift(1))

def condition2(): 
    return (df.High < 12)


In [72]: df['New_Close'] = np.where(condition1(), 'A', 'B')

In [73]: df
Out[73]:
   Close  High  Low New_Close
0     10    11   10         B
1     11    12   10         A
2     10    11    9         B

In [74]: df['New_High'] = np.where(condition2(), '<12', '>=12')

In [75]: df
Out[75]:
   Close  High  Low New_Close New_High
0     10    11   10         B      <12
1     11    12   10         A     >=12
2     10    11    9         B      <12

PS IMO直接像@PaulH said in his comment

那样更容易,更好