Замените пропущенные значения на наиболее частое число при условии

#python #pandas #scikit-learn #missing-data #mode

#python #панды #scikit-учиться #недостающие данные #режим

Вопрос:

Я пытаюсь заменить пропущенные значения столбца «Возраст», но при условии наличия других столбцов в этих титанических данных — машинное обучение после катастрофы

 df.Age[(df['Sex'] == 0) amp; (df['Pclass'] == 1)]
 

Я попытался сделать это с помощью SimpleImputer:

 from sklearn.impute import SimpleImputer
Imputer = SimpleImputer(missing_values=np.nan, strategy='most_frequent')

Imputer.fit_transform( pd.DataFrame(df.Age[(df['Sex'] == 0) amp; (df['Pclass'] == 1)]) )
 

но это не сработало, и я попытался сохранить значения в столбце:

 df.loc[(df.Age.isnull()) amp; (df.Age[(df['Sex'] == 0) amp; (df['Pclass'] == 1)]), 'Age'] = Imputer.fit_transform( pd.DataFrame(df.Age[(df['Sex'] == 0) amp; (df['Pclass'] == 1)]) )
 

но также не работает.

Я попытался сделать это вручную, используя fillna()

 df.loc[(df['Sex'] == 0) amp; (df['Pclass'] == 1), 'Age'].fillna(int(df.Age[(df['Sex'] == 0) amp; (df['Pclass'] == 1)].mode()), inplace=True)
 

Я попытался использовать индексы для доступа к строкам и обновления их значений:

 mod = int(df.Age[(df['Sex'] == 0) amp; (df['Pclass'] == 1)].mode())
indices = df.loc[(df.Age.isnull()) amp; (df.Sex == 0) amp; (df.Pclass == 1), 'Age'].isnull().index
df.loc[ind, 'Age'] = mod
df[(df['Sex'] == 0) amp; (df['Pclass'] == 1)]['Age'].isnull().sum()
 

это сработало, и результат был: 0, но когда я пытаюсь применить его в цикле for, он выдает ошибку

 for i in range(1,3):
    for j in range(1,4):    
        indices = df.loc[(df.Sex == i) amp; (df.Pclass == j), 'Age'].isnull().index
        mod = int(df.Age[(df['Sex'] == i) amp; (df['Pclass'] == j)].mode())
        df.loc[ind, 'Age'] = mod
 

Я хочу знать, в чем ошибка первых 2-х способов и почему 3-й не работает в цикле?

Ответ №1:

Попробуйте использовать метод pad. Он принимает самое последнее значение. После этого вы можете удалить определенные значения на основе условий из других столбцов.

 df.fillna(method='pad')
 

Комментарии:

1. for i in range(1,3): for j in range(1,4): df.Age[(df.Sex == i) amp; (df.Pclass == j)].fillna(method='pad', inplace=True) df[(df['Sex'] == 0) amp; (df['Pclass'] == 1)]['Age'].isnull().sum() Недостающие значения все еще существуют

Ответ №2:

Это решение работает хорошо, но я не знаю, почему выше не работает!

 Imputer = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
for i in range(2):
    for j in range(1,4):
        ls = np.array(df.Age[((df.Sex==i) amp; (df.Pclass==j))]).reshape(-1,1)
        df.Age[((df.Sex==i) amp; (df.Pclass==j))] = Imputer.fit_transform(ls)[:,0]
df.Age.isnull().sum()