Python 根据df1上的条件创建pd系列,并报告df2或df3中的值

Python 根据df1上的条件创建pd系列,并报告df2或df3中的值,python,pandas,dataframe,Python,Pandas,Dataframe,第一个帖子在这里。我是Python新手,但利用这里发布的其他问题的答案,我已经取得了很多进展。不幸的是,我在这项看似简单的任务上遇到了麻烦。 我有3个熊猫系列,以日期为索引 df1 = {'signal': [0,0,1,1,0,0,1]} #binary trading signal df2 = {'SPX': [5,0,5,1,0,5,2]} #S&P 500 returns df3 = {'UST': [-1,1,1,0,1,-1,0]} #10yr Treasu

第一个帖子在这里。我是Python新手,但利用这里发布的其他问题的答案,我已经取得了很多进展。不幸的是,我在这项看似简单的任务上遇到了麻烦。 我有3个熊猫系列,以日期为索引

df1 = {'signal': [0,0,1,1,0,0,1]}  #binary trading signal

df2 = {'SPX': [5,0,5,1,0,5,2]}     #S&P 500 returns

df3 = {'UST': [-1,1,1,0,1,-1,0]}   #10yr Treasury returns
我正在尝试创建一个新的系列df4,它将代表交易信号的回报曲线。如果信号=1,则获取当天的df3值,否则给我df2值(适用于所有零)

我已经找到了很多关于这个话题的帖子,看起来很简单,但我一直在努力让它们发挥作用。 我尝试了一个简单的if语句

df4 = df1
    if df1 == 1:
        df4.replace(1, df3)
    else:
        df4.replace(0, df2)
但是我得到了ValueError:级数的真值是模糊的。使用a.empty、a.bool()、a.item()、a.any()或a.all()。 如果添加df1.any(),则不会进行任何更改

我也尝试过使用其他解决方案,但失败了

df4 = df1.apply(lambda x: df2 if x == 0 else df3, axis=1)

df4 = df1.loc[df1 == 1, df3] == df2

df4 = df1.select([df1 > 0], [df3], default=df2)
我关心的一件事是,如果我用df3返回的值替换df4中的所有1,并且在某个点上它恰好是一个0。。。然后,如果我对df4中的所有0进行第二次替换,我可能会放置一个应该保留的0

非常感谢您对我的任何帮助,告诉我如何最有效地执行此操作。

请使用
Series.where()
,指定列名

与数据帧值一起使用

df1 = pd.DataFrame({'signal': [0,0,1,1,0,0,1]})  #binary trading signal
df2 = pd.DataFrame({'SPX': [5,0,5,1,0,5,2]})     #S&P 500 returns
df3 = pd.DataFrame({'UST': [-1,1,1,0,1,-1,0]})   #10yr Treasury returns

data = np.where(df1.values,df3.values,df2.values)
df4 = pd.DataFrame(data)
#df4 = pd.DataFrame(np.where(df1.values,df3.values,df2.values)) 

如果数据帧实际上有更多的列,则需要指定-
。实际上不需要指定值

pd.DataFrame(np.where(df1['signal'],df3['UST'],df2['SPX']))
# or
pd.DataFrame(np.where(df1.signal,df3.UST,df2.SPX))


使用
numpy.where
DataFrame.where

要快得多。我想你的意思是
df1=pd.DataFrame({'signal':[0,0,1,1,0,0,0,1]})
这样你就有了数据帧而不是dicts了?对不起,是的。语法不是从指尖上滑下来的哦,哇,这两个功能都很好。期待着这些次要任务成为第二天性的时刻。非常感谢你们两位!
pd.DataFrame(np.where(df1['signal'],df3['UST'],df2['SPX']))
# or
pd.DataFrame(np.where(df1.signal,df3.UST,df2.SPX))