数据:
Date Stock Peak Trough Price
2002-01-01 33.78 False False 25
2002-01-02 34.19 False False 35
2002-01-03 35.44 False False 33
2002-01-04 36.75 False False 38
每当股票价格高于或等于从第4列开始的行中的最大值时,我使用以下代码行将每一行的“ Peak”设置为true:
df['Peak'] = np.where(df.iloc[:,4:].max(axis=1) >= df[stock], 'False', 'True')
但是,我正在尝试使其不影响前X行和后Y行。假设在此示例中X和Y均为10。我这样修改它:
df.iloc[10:-10]['Peak'] = np.where(df.iloc[10:-10,4:].max(axis=1) >= df.iloc[10:-10][stock], 'False', 'True')
这给我一个错误SettingWithCopyWarning,也不再起作用。有谁知道如何获得所需的结果,以使前X行和后Y行始终为False?
问题来源:stackoverflow
我相信当使用df.iloc []
分配时,您需要get_loc
来指定列索引:
df.iloc[10:,df.columns.get_loc('year')] = (np.where(df.iloc[10:,4:].max(axis=1)
>= df.iloc[10:,df.columns.get_loc('stock')],'False', 'True'))
要尝试这里是一个测试用例:
np.random.seed(123)
df = pd.DataFrame(np.random.randint(0,100,(5,4)),columns=list('ABCD'))
print(df)
A B C D
0 66 92 98 17
1 83 57 86 97
2 96 47 73 32
3 46 96 25 83
4 78 36 96 80
尝试将索引2中的列D设置为np.nan
,我们会得到相同的错误:
df.iloc[2:]['D']=np.nan
试图在DataFrame的切片副本上设置一个值。尝试改用.loc [row_indexer,col_indexer] = value
请参阅文档中的警告:http : //pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy“”“启动IPython内核的入口点。
尝试同样的操作,避免使用get_loc
(成功的 )进行链接分配
df.iloc[2:,df.columns.get_loc('D')] = np.nan
print(df)
A B C D
0 66 92 98 17.0
1 83 57 86 97.0
2 96 47 73 NaN
3 46 96 25 NaN
4 78 36 96 NaN
回答来源:stackoverflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。