#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]))