Работа С Пропущенными Значениями В Pandas

Отсутствующее значение в наборе данных отображается в виде вопросительного знака, нуля, NaN или просто пустой ячейки.

Но как справиться с недостающими данными? Конечно, каждая ситуация индивидуальна и должна оцениваться по-разному.

Есть много способов справиться с пропущенными значениями.

Рассмотрим типичные варианты на примере набора данных «Титаник».

Эти данные представляют собой открытый набор данных Kaggle. Для анализа вам необходимо импортировать библиотеки Python и загрузить данные.

Для загрузки используется метод Pandas read.csv().

Путь к файлу в кавычках указывается в круглых скобках, чтобы Pandas считывал файл во фрейм данных (Dataframes — df) с этого адреса.

Путь к файлу может быть URL-адресом или локальным адресом файла.

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
   

# import the libraries import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline import matplotlib as plt import matplotlib as mpl import matplotlib.cm as cm import matplotlib.pyplot as plt from matplotlib import pyplot # import the dataset train_df = pd.read_csv(r'C:\Users\Tatiana\Desktop\Python\titanic\train.csv') train_df.head(2)



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

Показывает первые 2 строки загруженного фрейма данных.

Посмотрим на размер данных (количество строк, столбцов):

train_df.shape

(891, 12) Чтобы просмотреть статистическую сводку по каждому столбцу и увидеть распределение данных в каждом столбце, используйте метод описать().

Этот метод показывает нам количество строк в столбце — count, среднее значение столбца — среднее, столбец стандартного отклонения — std, минимальное (min) и максимальное (max) значения, а также границу каждого квартиля.

- 25%, 50% и 75%.

Любые значения NaN автоматически пропускаются.



train_df.describe()



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

метод описания( ) По умолчанию метод описать ( ) пропускает строки и столбцы, которые не содержат чисел — категориальных признаков.

Чтобы включить сводку по всем столбцам, нужно в скобках добавить аргумент — include="all".



# describe all the columns train_df.describe(include = "all")



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

описание метода (включить = «все») Для категориальных признаков этот метод показывает: — сколько уникальных значений в наборе данных — уникальных; высшие ценности; частота появления значений - фрег.

Метод info() — показывает информацию о наборе данных, индекс, столбцы и тип данных, ненулевые значения и использование памяти.



# look at the info print(train_df.info())



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

показывает информацию о наборе данных, индекс, столбцы и тип данных, ненулевые значения и использование памяти.

В результате мы видим, что все столбцы, кроме столбцов «Возраст», «Кабина» и «На посадке», содержат 891 строку.

Столбец «Выжившие» представляет собой целевое значение.

Показывает, кто выжил, а кто нет. Этот столбец заполнен двоичными значениями: 0 - не выжил 1 - выжил Метод — value_counts().

Подсчет значений — хороший способ понять, сколько единиц каждой характеристики/переменной у нас есть.



train_df['Survived'].

value_counts()



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

подсчет значений в столбце «Выжившие» Из 891 пассажира выжили 342.

sns.set_style('whitegrid') sns.countplot(x='Survived',data=train_df,palette='RdBu_r')



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

график подсчета значений в столбце «Выжившие» Из 891 пассажира выжили 342, что составляет 38%.



figure, survive_bar = plt.subplots(figsize=(7, 7)) sns.barplot(x= train_df["Survived"].

value_counts().

index, y = train_df["Survived"].

value_counts(), ax = survive_bar) survive_bar.set_xticklabels(['Not Survived', 'Survived']) survive_bar.set_ylabel('Frequency Count') survive_bar.set_title('Count of Survival', fontsize = 16) for patch in survive_bar.patches: label_x = patch.get_x() + patch.get_width()/2 # find midpoint of rectangle label_y = patch.get_y() + patch.get_height()/2 survive_bar.text(label_x, label_y, #left - freq below - rel freq wrt population as a percentage str(int(patch.get_height())) + '(' + '{:.

0%}'.

format(patch.get_height()/len(train_df.Survived))+')', horizontalalignment='center', verticalalignment='center')



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

График подсчета значений в столбце «Выжившие» Визуализация: Графики значений счета в столбцах - «Выжил», «Пкласс», «Пол», «СибСп», «Парч», «Встал»

fig, myplot = plt.subplots(figsize = (15,6), nrows = 2,ncols = 3) features = ["Survived","Pclass","Sex","SibSp","Parch","Embarked"] row, col, num_cols = 0,0,3 for u in features: sns.barplot(x = train_df[u].

value_counts().

index,y = train_df[u].

value_counts(), ax = myplot[row, col]) myplot[row, col].

set_xlabel("") myplot[row, col].

set_title(u + " Titanic", fontsize = 15) myplot[row, col].

set_ylabel("Count") col = col + 1 if col == 3: col = 0 row = row + 1 plt.subplots_adjust(hspace = 0.5) plt.subplots_adjust(wspace = 0.3) # i put roundbracket around x,y,z to make more sense. just like how x \in [1,2,3] # and if x is a tuple or bracket #we have u \in [(1,2,3),(2,3,5),.

] where u = (x,y,z) #for each patch in each graph from [0,0] to [1,2], we want to do the following. for v in range(2): for z in range(3): for patch in myplot[v,z].

patches: label_x = patch.get_x() + patch.get_width()/2 # find midpoint of rectangle label_y = patch.get_y() + patch.get_height()/2 myplot[v,z].

text(label_x, label_y, str(int(patch.get_height())) + '('+'{:.

0%}'.

format( patch.get_height()/len(train_df.Survived))+')', horizontalalignment='center', verticalalignment='center')



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

Графики подсчета значений в столбцах - «Выжил», «Пкласс», «Пол», «СибСп», «Парч», «Встал на борт».

Теперь давайте посмотрим на столбцы, в которых пропущены значения.

Существует два метода обнаружения недостающих данных: isnull() и notnull().

Результатом является логическое значение, указывающее, действительно ли значение, переданное в аргумент, отсутствует. True означает, что значение отсутствует, а False означает, что значение отсутствует.

# Evaluating for Missing Data missing_data = train_df.isnull() missing_data.head(6)



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

Верно – пропущенные значения Используя цикл for в Python, мы можем быстро определить количество пропущенных значений в каждом столбце.

Как упоминалось выше, «Истина» представляет отсутствующее значение, а «Ложь» означает, что значение присутствует в наборе данных.

В теле цикла for метод «.

value_counts()» подсчитывает количество значений «True».



# Count missing values in each column for column in missing_data.columns.values.tolist(): print(column) print(missing_data[column].

value_counts()) print(" ")



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

количество пропущенных значений в каждом столбце.



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

количество пропущенных значений в каждом столбце.

Посмотрим, сколько пропущенных значений в каждом столбце.



train_df.isnull().

sum()



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

количество пропущенных значений в каждом столбце.

'Возраст' В столбце «Возраст» отсутствует 177 значений.

И нужно понять, систематическая это ошибка или какая-то случайная ошибка.

Например, может быть, у пассажиров 1-го класса (или женщин) не спросили об их возрасте (потому что это было неприлично), или они случайно его пропустили.

Понимание причины пропущенных значений определит, как бороться с этими недостающими данными.

Возраст необходимо сгруппировать с учетом того, отсутствует ли возраст или нет. Для группировки мы используем метод groupby().

Правда, без возраста Ложь — значение заполнено

# missing age or not train_df.groupby(train_df['Age'].

isnull()).

mean()



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

метод groupby().

True – нет возраста, False – значение заполнено Среди пассажиров, у которых отсутствовало значение возраста, были выжившие (около 30%) и умершие (около 70%) – столбец «Выжившие», True = 0,29. Эти пассажиры были в нижнем классе:

  • столбец «Pclass» — True = 2,59 (это среднее значение по классу)
  • Столбец «Тариф» — True = 22,15 (это средняя стоимость билета)
Подсчет значений в столбце «Pclass»:

# Value Counts train_df['Pclass'].

value_counts()



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

Подсчет значений в столбце «Pclass» Например, в 3 классе был 491 пассажир (это 55%).



train_df.groupby(['Pclass']) ['Survived'].

value_counts(normalize=True)



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

Выживаемость пассажиров по классам Для более детального анализа создадим новый столбец Age_NaN (двоичный классификатор).

Используем методwhere(), где пишем условие: - если в столбце «Возраст» нет значения, то в столбце «Возраст_NaN» присваиваем значение 0, если оно есть, то 1.

# Let's create a new column 'Age_NaN' # If there is no value in the "Age" column, then = 0 and yes value = 1 train_df['Age_NaN'] = np.where(train_df['Age'].

isnull(), 0,1) train_df.head(6)



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

первые 6 строк фрейма данных с новым столбцом Age_NaN Подсчет значений в столбце Age_NaN

# Value Counts train_df['Age_NaN'].

value_counts()



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

Подсчет значений в столбце Age_NaN Выживаемость пассажиров в зависимости от наличия возрастных записей.



# Survived passengers by 'Age_NaN' train_df.groupby(['Age_NaN']) ['Survived'].

value_counts(normalize=True)



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

Выживаемость пассажиров в зависимости от наличия возрастных записей.

И снова мы видим: - что среди пассажиров, у которых отсутствовало значение возраста, были выжившие (около 30%) и погибшие (около 70%).

Выживание пассажиров в зависимости от наличия возрастных и классовых записей.



train_df.groupby(['Age_NaN','Pclass']) ['Survived'].

value_counts(normalize=True)



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

Выживание пассажиров в зависимости от наличия возрастных и классовых записей.



pd.crosstab(train_df['Pclass'], train_df['Age_NaN'])



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

в зависимости от наличия записей о возрасте и классе.

В первый класс 30 пассажирам вход воспрещен.

Из 30 пассажиров выжили 46% (14 пассажиров), погибли 53% (16 пассажиров).

Общее количество пассажиров первого класса составило 216 (в этом наборе данных).

Во второй класс 11 пассажирам вход воспрещен.

Из 11 пассажиров выжили 36% (4 пассажира), погибли 63% (7 пассажиров).

Общее количество пассажиров второго класса составило 184 (в этом наборе данных).

В третий класс вход воспрещен 136 пассажирам.

Из 136 пассажиров выжили 25% (34 пассажира), погибли 75% (102 пассажира).

Общее количество пассажиров третьего класса составило 491 (в этом наборе данных).

Выживаемость пассажиров в зависимости от наличия возрастных и половых записей.



train_df.groupby(['Age_NaN','Sex']) ['Survived'].

value_counts(normalize=True)



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

Выживаемость пассажиров в зависимости от наличия возрастных и половых записей.



pd.crosstab(train_df['Sex'], train_df['Age_NaN'])



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

в зависимости от наличия записи о возрасте и поле.

У 53 женщин не было записей о возрасте.

Из 53 женщин выжили 68% (36 женщин), умерли 32% (17 женщин).

Всего было 314 женщин (в этом наборе данных).

У 124 мужчин не было записей о возрасте.

Из 124 мужчин выжили 13% (16 мужчин), умерли 87% (108 мужчин).

Всего мужчин было 577 (в этом наборе данных).

В третьем классе было много пассажиров, и многие погибли.

Пассажиры — мужчины, у которых был более дешевый билет и класс ниже, — имели меньше шансов выжить.

Потому что среди пассажиров, у которых отсутствовало значение возраста, были выжившие (около 30%) и погибшие (около 70%), причем пассажиры были из разных классов (из 3-го класса их было значительно больше), а среди пассажиров были мужчины и женщины (мужчин было значительно больше), то при опросе выживших и осмотре тел погибших возраст пассажира мог быть случайно упущен.

Поэтому делаем вывод, что возраст введен не случайно.

Решение: Заполните пропущенные значения средним значением.



# missing values are replaced by the average value train_df['Age'].

fillna(train_df['Age'].

mean(), inplace = True) sns.set_style('whitegrid') %matplotlib inline g = sns.FacetGrid(train_df, col='Survived') g.map(plt.hist, 'Age', bins=10)



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

Выживаемость пассажиров в зависимости от возраста Давайте посмотрим на выживаемость пассажиров в зависимости от класса и возраста.



# Survived passengers by Pclass and Age grid = sns.FacetGrid(train_df, col ='Survived', row ='Pclass', height = 3.5, aspect=1.5) grid.map(plt.hist, 'Age', alpha=.

5, bins=10) grid.add_legend();



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

карта выживаемости пассажиров в зависимости от класса и возраста 'Кабина' В столбце «Каюта» отсутствует 687 значений.

Поскольку пропущенных значений много, вы можете полностью удалить столбец «Каюта» или оставить недостающие данные как недостающие данные.

Здесь важно понять следующее: - Есть ли какая-то систематическая связь между выживанием и наличием у пассажира отдельной кабины.

Для группировки мы используем метод groupby().

Правда - нет упоминания о каюте Ложь — значение заполнено

# missing cabin or not # Relationship between the presence of a value in the "Cabin" column on the survival rate train_df.groupby(train_df['Cabin'].

isnull()).

mean()



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

метод groupby().

True – о кабине нет упоминания, False – значение заполняется Те пассажиры, у которых нет записи - выжили около 30%.

А тех, у кого есть запись о наличии каюты - выжило 67%.

Вывод: существует взаимосвязь между выживанием и наличием хижины.

Решение: Создайте новый столбец Cabin_available (двоичный классификатор).

Используем методwhere(), где пишем условие: - Если в столбце «Кабина» нет значения, то в столбце «Кабина_доступен» присваиваем значение 0, если оно есть, то 1.

# Let's create a new column 'Cabin_available' # If there is no value in the "Cabin" column, then = 0 and yes value = 1 train_df['Cabin_available'] = np.where(train_df['Cabin'].

isnull(), 0,1) train_df.head(6)



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

показывает первые 6 строк фрейма данных с новым столбцом Cabin_available Выживаемость пассажиров в зависимости от наличия бортовой записи:

train_df.groupby(['Cabin_available']) ['Survived'].

value_counts(normalize=True)



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

Выживаемость пассажиров в зависимости от наличия записи в салоне

train_df.pivot_table( 'PassengerId', 'Cabin_available', 'Survived', 'count').

plot( kind='bar', stacked=True)



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

Схема выживаемости пассажиров в зависимости от наличия записи в салоне Теперь столбец «Каюта» можно удалить.



train_df.drop(['Cabin'], axis = 1, inplace = True) train_df



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

фрейм данных без столбца «Каюта» «Приступил» В столбце «Порт посадки» отсутствуют два значения.

Это категорическая особенность.

Решение: Заменить пропущенные значения по частоте.

Замените отсутствующее значение значением, которое чаще всего появляется в определенном столбце.



train_df['Embarked'].

value_counts()



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

подсчет значений в столбце «На посадке» Наиболее распространенное значение S — 644. Пропущенные значения необходимо заменить на S.

# replace the missing 'Embarked' values by the most frequent - S train_df['Embarked'].

replace(np.nan, 'S', inplace = True) train_df['Embarked'].

describe()



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

Опишите() для столбца «Начало» после замены пропущенных значений.

Хороший! Теперь у нас есть набор данных без пропущенных значений.

(Хорошо! Теперь у нас есть набор данных без пропущенных значений.

)

train_df.isnull().

sum()



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

набор данных без пропущенных значений Теги: #Машинное обучение #python #программирование #Визуализация данных #Открытые данные #pandas #python3 #Numpy #matplotlib #визуализация данных #seaborn #очистка данных #предварительная обработка #обработка данных #пропущенные значения

Вместе с данным постом часто просматривают: