Задать вопрос
@El_eventh

Pandas: Как вернуть один столбец из двух переданных в DataFrame.apply()?

Добрый день!
Есть такой DataFrame:
63c13265b0c7a386487520.png
Присутствуют пустые строки в столбце 'Возраст'. Я хочу их заменить на средние значения в соответствии с классом (т.к. есть корреляция).
Пробую реализовать так:
#Загрузка данных в data
data = ...

# Средний возраст для каждого соц класса
soc = pd.Series(data['Социальный класс'].unique(), name='Социальный класс')
mean = pd.Series([data['Возраст'].loc[data['Социальный класс'] == _].mean() for _ in soc], name='Возраст')
soc_mean = pd.concat([soc, mean], axis=1)

# Фильтруем дату. Если возраст NaN то выполняется условие получения возраста из soc_mean
func_filter = lambda x: soc_mean['Возраст'].loc[soc_mean['Социальный класс'] == x['Социальный класс']] if x['Возраст'] != x['Возраст'] else x['Возраст']
data['Возраст'] = data[['Социальный класс', 'Возраст']].apply(func_filter, axis=1)


Так как в последней строке я пытаюсь вернуть в data отфильтрованный soc_mean(DataFrame) в ячейку с NaN. Туда попадает весь DataFrame, вместо самого значения.
Однако второй столбец('Социальный класс') в soc_mean нужен для фильтрации, возможно ли вернуть только soc_mean['Возраст']?

PS lambda

Заметил, что лямбда очень нагружена и тяжела для понимания. Изначально думал над решение типа:
func = lambda x, y: soc_mean[x] if y != y else y
Но так и не додумался как это реализовать, потому что в .apply() не смог передать столбцы в разных переменных. Сколько не искал, так и не нашел примера где в .apply() передают разные столбцы по смыслу (1 для фильтра, 2 для изменения).
  • Вопрос задан
  • 190 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
Первое что бы получить mean по группам для этого в pandas есть мощный инструмент groupby
например в вашем случае
means = data.groupby('Социальный класс').mean()
Это даст вам датафрейм где вы на группе запустили аггрегирующуюю функцию (можно не одну)
теперь к ответу на вопрос все решается в одну строчку
data["Возраст"] = data.groupby("Социальный класс").transform(lambda x: x.fillna(x.mean()))

все этот код решит ваш вопрос, для его лучшего понимания (очень рекомендую) разберитесь как следует с groupby это очень частая проблема.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы