开发者社区> 问答> 正文

Python:尝试根据条件将值设置为True时的SettingWithCopyWarning

数据:

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

展开
收起
is大龙 2020-03-23 17:38:19 460 0
1 条回答
写回答
取消 提交回答
  • 我相信当使用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

    2020-03-23 17:38:26
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载