问题描述
我有以下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