Не записывает значения в pd.DataFrame
Пишу свой класс групповой импутации данных, когда по какой-то категории одного признака считается статистика других признаков, и этой статистикой заполняются пропуски в данных. Код класса:
class StepanGroupImputer():
def __init__(self,aggfun='mean'):
self._group_impute_dict = {}
self.aggfun = aggfun
def fit(self,x, by_column, group_columns, aggfun, y=None):
# По каждому столбцу, в котором надо заполнить пропуски выполним вычисление групповых значений агрегирующих функций
for col in group_columns:
# Если аггрегирующая функция присуща числовым типам, то...
if aggfun in ['max','min','mean','median']:
# Значения агрегирующей функции aggfun по категориям переменной by_column,
# преобразованные в словарь. Поскольку изначально выбрано минимально необходимое
# подмножество, состоящее из группирующей категориальной фичи и группируемой числовой,
# то, чтобы избавиться от ключа-кортежа - обращаемся к методу .values(), полученную структуру
# обращем в список и выбираем нулевой и единственный элемент, который представляет собой
# элементарный словарь структуры {cat_1: aggfunc_value_1,
# cat_2: aggfunc_value_2,
# cat_3: aggfunc_value_3, ...}
agg_stats = list(x[[by_column,col]].groupby(by=by_column).agg(aggfun).to_dict().values())[0]
# Элементарный словарь добавляется в словарь верхнего уровня под ключем - названием количественной фичи
# со структурой {col_1: {cat_1: aggfunc_value_1,
# cat_2: aggfunc_value_2,
# cat_3: aggfunc_value_3, ...},
# col_2: {cat_1: aggfunc_value_1,
# cat_2: aggfunc_value_2,
# cat_3: aggfunc_value_3, ...} ...}
self._group_impute_dict[col] = agg_stats
# Если же аггрегирующая функция присуща строковым категориальным переменным,
# в частности мода, то...
elif aggfun=="mode":
# Получение аналогичного словаря, только с помощью метода apply и лямбда-функции.
# Элементарный словарь будет иметь немного неудобую структуру, где ключами будут кортежи
# {(cat_1, 0): aggfunc_value_1,
# (cat_2, 0): aggfunc_value_2,...}
agg_stats = [[by_column,col]].groupby(by=by_column)[col].apply(lambda x: x.mode()).to_dict()
self._group_impute_dict[col] = agg_stats
else:
raise AttributeError("Несоответствующее значение"+aggfun)
print(self._group_impute_dict)
return self
def transform(self,x, by_column, group_columns, rewrite):
for col in group_columns:
for cat in self._group_impute_dict[col]:
#print(x[x[by_column]==cat][col])
cat_index = x[x[by_column]==cat].index
#x.loc[cat_index,col] = np.where(x[x[by_column]==cat][col]==np.nan,
# round(self._group_impute_dict[col][cat]),
# x[x[by_column]==cat][col])
x.loc[cat_index,col].fillna(round(self._group_impute_dict[col][cat]),inplace=rewrite)
return x
Однако при методе transform
Замена пропусков не происходит. Как это исправить? Благодарю.