import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import scipy import missingno as msno from sklearn.impute import SimpleImputer titanic = pd.read_csv('train.csv') sns.set() titanic.info() titanic.Age.astype('int') titanic.isna().sum() (titanic.isna().sum() / len(titanic)).round(4) * 100 msno.bar(titanic) msno.matrix(titanic) titanic[['Age', 'Cabin', 'Embarked']].isnull().corr() df = titanic.iloc[:, [i for i, n in enumerate(np.var(titanic.isnull(), axis = 'rows')) if n > 0]] df.isnull().corr() msno.heatmap(titanic) # удаление строк обозначим через axis = 'index' # subset = ['Embarked'] говорит о том, что мы ищем пропуски только в столбце Embarked titanic.dropna(axis = 'index', subset = ['Embarked'], inplace = True) # убедимся, что в Embarked действительно не осталось пропусков titanic.Embarked.isna().sum() # передадим в параметр columns тот столбец, который хотим удалить titanic.drop(columns = ['Cabin'], inplace = True) # убедимся, что такого столбца больше нет titanic.columns sex_g = titanic.groupby('Sex').count() sex_g # сравним количество пассажиров в столбце Age и столбце PassengerId sex_g['PassengerId'].sum(), sex_g['Age'].sum() # метод .mean() игнорирует пропуски и не выдает ошибки titanic['Age'].mean() # то же можно сказать про метод .corr() titanic[['Age', 'Fare']].corr() # еще раз загрузим датасет "Титаник", в котором снова будут пропущенные значения titanic = pd.read_csv('/content/train.csv') # возьмем лишь некоторые из столбцов !!!!!!!!!!!!!!!!!! titanic = titanic[['Pclass', 'Survived', 'Sex', 'SibSp', 'Parch', 'Fare', 'Age', 'Embarked']] # закодируем столбец Sex с помощью числовых значений map_dict = {'male' : 0, 'female' : 1} titanic['Sex'] = titanic['Sex'].map(map_dict) # посмотрим на результат titanic.head() # вначале сделаем копию датасета fillna_const = titanic.copy() # заполним пропуски в столбце Age нулями, передав методу .fillna() словарь, # где ключами будут названия столбцов, а значениями - константы для заполнения пропусков fillna_const.fillna({'Age' : 0}, inplace = True) titanic.Age.median(), fillna_const.Age.median() # найдем пассажиров с неизвестным портом посадки # для этого создадим маску по столбцу Embarked и применим ее к исходным данным missing_embarked = pd.read_csv('/content/train.csv') missing_embarked[missing_embarked.Embarked.isnull()] # метод .fillna() можно применить к одному столбцу # два пропущенных значения в столбце Embarked заполним буквой S (Southampton) fillna_const.Embarked.fillna('S', inplace = True) # убедимся, что в столбцах Age и Embarked не осталось пропущенных значений fillna_const[['Age', 'Embarked']].isna().sum() # сделаем копию датасета const_imputer = titanic.copy() # импортируем класс SimpleImputer из модуля impute библиотеки sklearn from sklearn.impute import SimpleImputer # создадим объект этого класса, указав, # что мы будем заполнять константой strategy = 'constant', а именно нулем fill_value = 0 imp_const = SimpleImputer(strategy = 'constant', fill_value = 0) # и обучим модель на столбце Age # мы используем двойные скобки, потому что метод .fit() на вход принимает двумерный массив imp_const.fit(const_imputer[['Age']]) # также используем двойные скобки с методом .transform() const_imputer['Age'] = imp_const.transform(const_imputer[['Age']]) # убедимся, что пропусков не осталось и посчитаем количество нулевых значений const_imputer.Age.isna().sum(), (const_imputer['Age'] == 0).sum() # удалим его const_imputer.drop(columns = ['Embarked'], inplace = True) # и посмотрим на размер получившегося датафрейма const_imputer.shape # посмотрим на результат const_imputer.head(3) # сделаем копию датафрейма fillna_median = titanic.copy() # заполним пропуски в столбце Age медианным значением возраста, # можно заполнить и средним арифметическим через метод .mean() fillna_median.Age.fillna(fillna_median.Age.median(), inplace = True) # убедимся, что пропусков не осталось fillna_median.Age.isna().sum() # изменим размер последующих графиков sns.set(rc = {'figure.figsize' : (10, 6)}) # скопируем датафрейм median_imputer = titanic.copy() # посмотрим на распределение возраста до заполнения пропусков sns.histplot(median_imputer['Age'], bins = 20) plt.title('Распределение Age до заполнения пропусков'); median_imputer['Age'].mean().round(1), median_imputer['Age'].median()