Python 根据df1上的条件创建pd系列,并报告df2或df3中的值
第一个帖子在这里。我是Python新手,但利用这里发布的其他问题的答案,我已经取得了很多进展。不幸的是,我在这项看似简单的任务上遇到了麻烦。 我有3个熊猫系列,以日期为索引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
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))