是否有更简单的方法来编写以下代码?目前代码正在运行,这很奇怪。它出了点问题......对于目标来说似乎太复杂了。我还收到一条SettingWithCopyWarning
通知说:
正在尝试在DataFrame
的切片副本上设置值
目标是:我有四个时间序列/列 - a, b, c and d
,其中d
是需要填充的输出列。
a
大于b
,则在d
列中返回1,a
低于c
,则在d
列中返回0,a
介于b
和c
之间,则返回d
列中的上一项。请注意,最后一个if
语句引用了d列中的上一个项目。
data['d']=1
data['previous_d']=1
for i in range (len(data.a)):
data.previous_d.iloc[i]=data.d.iloc[i-1]
data.stance.iloc[i] = np.where((data.a.iloc[i]> data.b.iloc[i]),1,np.where((data.a.iloc[i]< data.c.iloc[i]),0,data.previous_d.iloc[i]))
答案 0 :(得分:0)
只需要一些布尔索引就可以了
data.loc[data.a> data.b,'d'] = 1
data.loc[data.a < data.c,'d'] = 0
data.loc[(data.a < data.b) & (data.a > data.c),'d'] = data.d.shift(1)
或者,如果第三个条件意味着未填充数字之间的所有内容都是从上一个填充值中填充的,请使用
data.d.fillna(method='ffill',inplace=True)
而不是最后一行