Избегайте SettingWithCopyWarning в python с использованием iloc

#python #pandas #dataframe #series

#python #pandas #фрейм данных #Серии

Вопрос:

Обычно, чтобы избежать SettingWithCopyWarning, я заменяю значения, используя .loc или .iloc, но это не работает, когда я хочу перенаправить заполнение моего столбца (от первого до последнего значения, отличного от 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,np.nan,2,22,8,np.nan,4,5,4,5,np.nan,-3,-54,-23,np.nan,89,np.nan,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")
  

Я бы хотел что-то подобное в конце :

введите описание изображения здесь

Комментарии:

1. что вы пытаетесь сделать? вы используете iloc не лучшим образом

2. @sygneto я пытаюсь перенаправить заполнение моего столбца с первого на последнее значение, отличное от nan

3. как насчет первых 3 строк? оставьте это как nans или заполните наоборот? (принимать значение из 4-й строки)?

4. @sygneto это означает, что первый и последний nan-адреса остаются nan-адресами

Ответ №1:

Используйте first_valid_index и last_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,np.nan,2,22,8,np.nan,4,5,4,5,np.nan,-3,-54,-23,np.nan,89,np.nan,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
  

Комментарии:

1. итак, вы хотите заполнять значения до тех пор, пока не будет существовать более 1 nan?

2. от первого допустимого индекса до последнего, проверьте документацию здесь pandas.pydata.org/pandas-docs/stable/reference/api/pandas . DataFrame.first_valid_index.html