在特定的DateTime索引处返回值-基于条件测试

问题描述

我有以下DataFrame:

           Var1   Var2  Var3   Var4
2019-01-01  0.5   0.0    0.1   0.05
2019-01-02  0.5   0.0    0.2   0.09
2019-01-03  0.0   0.5    0.4   0.02

以及以下遍历df的函数

def switch(row):
    if row.Var1 >= 0.5 and row.Var2 <= 0.5:
        return 'foo'
    elif row.Va1 <=0.5 and row.Var2 >= 0.5:
        return 'bar'
    else:
        return 'baz'

我已将该函数应用于空的pd.Series port_switching,以返回以下输出

port_switching = pd.Series([])
port_switching = df.apply(switch,axis=1)

print(port_switching)

2019-01-01    foo
2019-01-02    foo
2019-01-03    bar
Freq: D,dtype: object

@ jadore801120帮助我创建了该函数,但是现在我的最终问题是:在该函数返回“ foo”,“ bar”或“ baz”的情况下,我需要弄清楚如何返回Var3的值或Var4,具体取决于通过的条件,即“ if”,“ elif”或“ else”。

  • 因此在上面的示例中,在2019-01-01处,'foo'将作为Var3在2019-01-01年的值(即0.1)返回。

  • 同样,因为在2019-01-02通过了'if'条件,则将返回Var3的2019-01-02值,即0.2。

  • 最后,在2019-01-03通过了'elif'条件,因此该函数应在2019-01-04返回var4的值,即0.02。

最终产品应如下所示:

print(port_switching)
2019-01-01    0.1
2019-01-02    0.2
2019-01-03    0.02
Freq: D,dtype: object

假设,我正在处理大型数据集,并且无法手动输入这些值。我将继续独自解决问题,但是如果有人可以提供解决方案,那将需要几天的工作!

解决方法

numpy select应该可以帮助您应对挑战,而且它是矢量化的,因此应该比使用apply要快得多:

cond1 = df.Var1.ge(0.5) & (df.Var2.le(0.5))
cond2 = df.Var1.le(0.5) & (df.Var2.ge(0.5))
condlist = [cond1,cond2]
choicelist = [df.Var3,df.Var4]
df['result'] = np.select(condlist,choicelist)


           Var1 Var2    Var3    Var4    result
2019-01-01  0.5 0.0    0.1      0.05    0.10
2019-01-02  0.5 0.0    0.2      0.09    0.20
2019-01-03  0.0 0.5    0.4      0.02    0.02