Iterrows не сохраняет заполняемость

#python #pandas #loops #fillna

#python #pandas #циклы #заполнение

Вопрос:

Я хочу заполнить некоторые значения NaN из фрейма данных значением, которое я могу вычислить из уравнения линейной регрессии. Поскольку не все значения из фрейма данных равны NaN, я решил выполнить цикл по нему. Это фрейм данных:

 Country Afghanistan Albania Algeria
1985    NaN         NaN     NaN
1990    NaN         0.645   0.577
...     ...         ...     ...
  

И это цикл для соответствующего заполнения значений NaN

 for index, row in df3.iterrows():
    if row.isnull().any():
        row.fillna(value=float(index)*float(coefs[1]) coefs[0])
  

Мне было интересно, почему мой фрейм данных остается неизменным после выполнения цикла.
Заранее спасибо.

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

1. Потому что изменения в строках в iterrows не влияют на исходный фрейм данных.

2. fillna по умолчанию для него inplace установлено значение False . Вам нужно будет установить inplace=True , если вы хотите, чтобы это работало без присвоения результата строке

3. @yatu это не изменится df3 . Строки являются независимыми pd.Series объектами. Вы изменяете их на месте, но это не повлияет df3

4. Верно @juanpa.arrivillaga. Я думаю, что более простой способ — обновить напрямую, df3 основываясь на index , и использовать row для if условия

5. @yatu Я подозреваю, что вам вообще не нужно выполнять цикл.

Ответ №1:

Поскольку float(index) это индекс вашего фрейма данных, и вы хотите заменить NaN значения во всем вашем фрейме данных, вы можете сделать что-то вроде:

 df3 = df3.apply(lambda col: col.fillna(df3.index.to_series()*float(coefs[1]) coefs[0]))