避免使用iloc在python中设置SettingWithCopyWarning

问题描述

通常,为避免SettingtingWithcopyWarning,我使用.loc或.iloc替换值,但是当我要向前填充列(从第一个非nan值到最后一个非nan值)时,此方法不起作用。 您知道为什么这样做以及如何绕过它吗?

我的测试数据框:

df3 = pd.DataFrame({'Timestamp':[11.1,11.2,11.3,11.4,11.5,11.6,11.7,11.8,11.9,12.0,12.10,12.2,12.3,12.4,12.5,12.6,12.7,12.8,12.9],'test':[np.nan,np.nan,2,22,8,4,5,-3,-54,-23,89,np.nan]})

以及向我发出警告的代码

df3['test'].iloc[df3['test'].first_valid_index():df3['test'].last_valid_index()+1] = df3['test'].iloc[df3['test'].first_valid_index():df3['test'].last_valid_index()+1].fillna(method="ffill")

我最后想要这样的东西:

enter image description here

解决方法

使用first_valid_indexlast_valid_index确定要ffill的范围,然后选择数据框的范围

df = pd.DataFrame({'Timestamp':[11.1,11.2,11.3,11.4,11.5,11.6,11.7,11.8,11.9,12.0,12.10,12.2,12.3,12.4,12.5,12.6,12.7,12.8,12.9],'test':[np.nan,np.nan,2,22,8,4,5,-3,-54,-23,89,np.nan]})

first=df['test'].first_valid_index()
last=df['test'].last_valid_index()+1

df['test']=df['test'][first:last].ffill()
print(df)
    Timestamp  test
0        11.1   NaN
1        11.2   NaN
2        11.3   NaN
3        11.4   2.0
4        11.5  22.0
5        11.6   8.0
6        11.7   8.0
7        11.8   4.0
8        11.9   5.0
9        12.0   4.0
10       12.1   5.0
11       12.2   5.0
12       12.3  -3.0
13       12.4 -54.0
14       12.5 -23.0
15       12.6 -23.0
16       12.7  89.0
17       12.8   NaN
18       12.9   NaN