Добрый день!
Есть такой DataFrame:
Присутствуют пустые строки в столбце 'Возраст'. Я хочу их заменить на средние значения в соответствии с классом (т.к. есть корреляция).
Пробую реализовать так:
#Загрузка данных в 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 для изменения).