Вопрос или проблема
traindf[traindf['Gender'] == 'female']['Age'].fillna(value=femage,inplace=True)
Я пытался обновить нулевые значения в колонке возраста в датафрейме средними значениями. Здесь я пытался заменить нулевые значения в колонке возраста для женского пола на средний возраст женщин. Но колонка не обновляется. Почему?
traindf.loc[traindf['Gender'] == 'female','Age'] = traindf.loc[traindf['Gender'] == 'female','Age'].fillna(value=femage)
Ответ или решение
В вашем вопросе вы пытаетесь заполнить пропуски в столбце "Age" для женщин в датафрейме, используя среднее значение для женщин (переменная femage
). Давайте разберемся, почему ваш первоначальный подход не сработал и как правильно обновить значения.
Когда вы используете метод fillna()
с параметром inplace=True
, это применимо только к возвращаемому объекту, а не к оригинальному датафрейму. Поэтому данные в traindf
фактически не обновляются, когда вы вызываете fillna()
в этом контексте.
Ваш скорректированный код, который выполняет задачу правильно, выглядит так:
traindf.loc[traindf['Gender'] == 'female', 'Age'] = traindf.loc[traindf['Gender'] == 'female', 'Age'].fillna(value=femage)
Этот код работает следующим образом:
- Мы используем метод
.loc[]
, чтобы выбрать строки, где пол (Gender
) равен "female", и указать, что хотим обновить столбец "Age". - Внутри этого
.loc[]
стараемся заполнить пропуски значениемfemage
только в отфильтрованных данных (все записи с полом "female" в столбце "Age").
Таким образом, пропуски в столбце "Age" для женщин будут успешно заменены на среднее значение возраста женщин.
Ещё одна альтернатива, которую вы могли бы рассмотреть, это использование метода apply()
, если вы хотите сделать это более гибким способом:
traindf['Age'] = traindf.apply(lambda row: femage if pd.isnull(row['Age']) and row['Gender'] == 'female' else row['Age'], axis=1)
Этот подход также позволяет вам проверять условие и менять значения на femage
только для женщин с пропусками в возрасте.
Надеюсь, это поможет вам правильно обновить значения в вашем датафрейме! Если у вас есть дополнительные вопросы, не стесняйтесь их задавать.