Рубрики
Без рубрики

Pandas Nan – работа с отсутствующими данными

Pandas – Excel на стероидах — Мощная библиотека Python позволяет анализировать структурированные и табличные данные с удивительной эффективностью и легкостью. Пандас является одной из причин, почему мастер-кодеры достигают 100x эффективность средних кодеров. В современной статье вы узнаете, как работать с отсутствующими данными — в частности, как обрабатывать значения NAN в … Pandas Nan – Работа с отсутствующими данными Подробнее »

Автор оригинала: Chris.

Pandas – это Excel на стероидах – мощная библиотека Python позволяет анализировать структурированные и табличные данные с удивительной эффективностью и легкостью. Пандас является одной из причин, почему мастер-кодеры достигают 100x эффективность средних кодеров. В сегодняшней статье вы узнаете, как работать с отсутствующими данными, в частности, как обрабатывать значения NAN в Pandas dataframes. .

Вы узнаете обо всех разных причинах, по которым Nans появляются в ваших данных данных и как справиться с ними. Давайте начнем!

Проверка серии для NAN ценностей

Проблема Как проверить серию для ценностей NAN?

Посмотрите на следующий код:

import pandas as pd
import numpy as np

data = pd.Series([0, np.NaN, 2])
result = data.hasnans

print(result)
# True

Серия может содержать Нан -Валены – аббревиатура для Не – номер – Используйте неопределенные значения.

Чтобы проверить, содержит ли серия один или несколько Нан Значение, используйте атрибут Хаснаны Отказ Атрибут возвращает Правда Если есть хотя бы один Нан ценность и Ложь иначе.

Есть Нан Значение в серии, поэтому выход Правда Отказ

Фильтрация серии генерирует NAN

Проблема : Когда фильтрация Серия с где() И никакой элемент не передает условие фильтрации, в чем же результат?

import pandas as pd

xs = pd.Series([5, 1, 4, 2, 3])
xs.where(xs > 2, inplace=True)
result = xs.hasnans

print(result)
# True

Метод где () Фильтрует серию на Состояние Отказ Только элементы, которые удовлетворяют условию, остаются в полученной серии. А что происходит, если ценность не удовлетворяет условию? По умолчанию все строки не удовлетворяют условию, заполнены Нан -значения.

Вот почему наша серия содержит Нан -values после фильтрации его методом где () Отказ

Работа с несколькими сериями разных длин

Проблема : Если вам элемент-мудрый добавьте две серии объектов с другим количеством элементов – что происходит с оставшимися элементами?

import pandas as pd

s = pd.Series(range(0, 10))
t = pd.Series(range(0, 20))
result = (s + t)[1]

print(result)
# 2

Чтобы добавить два серии элемент-мудрый, используйте оператор добавления по умолчанию + Отказ Сериал не нужно иметь такого же размера, потому что как только первые серии заканчиваются, последующие результаты элемента – это Нан значения.

При индексе 1 В полученной серии вы получаете результат 1 + Отказ

Создайте dataframe из списка словарей с неравными ключами

Проблема : Как создать dataframe из списка словарей, если у словарей есть неравные ключи? DataFrame ожидает, что те же столбцы могут быть доступны для каждой строки!

import pandas as pd

data = [{'Car':'Mercedes', 'Driver':'Hamilton, Lewis'},
        {'Car':'Ferrari', 'Driver':'Schumacher, Michael'},
        {'Car':'Lamborghini'}]

df = pd.DataFrame(data, index=['Rank 2', 'Rank 1', 'Rank 3'])
df.sort_index(inplace=True)
result = df['Car'].iloc[0]

print(result)
# Ferrari

Вы можете создать DataFrame из A Список словарей Отказ Клавиши словарей определяют этикетки столбцов, и значения определяют записи столбцов. Не все словари должны содержать одни и те же клавиши. Если словарь не содержит определенного ключа, это будет интерпретироваться как Нан -значение.

Этот фрагмент кода использует строковые метки в качестве значений индекса в Сортировать DataFrame. После сортировки DataFrame строка с индексом метки Ранг 1 на месте 0 В DataFrame и значение в столбце Автомобиль это Ferrari Отказ

Сортировка данных DataFrame по столбцу с значениями NAN

Проблема : Что произойдет, если вы сортируете dataframe по столбцу, если столбец содержит Нан значение?

import pandas as pd

df = pd.read_csv("Cars.csv")

# Dataframe "df"
# ----------
#       make    fuel aspiration   body-style   price  engine-size
# 0     audi     gas      turbo        sedan   30000          2.0
# 1    dodge     gas        std        sedan   17000          1.8
# 2    mazda  diesel        std        sedan   17000          NaN
# 3  porsche     gas      turbo  convertible  120000          6.0
# 4    volvo  diesel        std        sedan   25000          2.0
# ----------

selection = df.sort_values(by="engine-size")
result = selection.index.to_list()[0]
print(result)
# 1

В этом фрагменте кода вы сортируете строки DataFrame по значкам столбца Размер двигателя Отказ

Главное то, что Нан Значения всегда перемещаются в конец в сортировке PandaS. Таким образом, первое значение – 1.8 который принадлежит к ряду с индексным значением 1 Отказ

Считайте ненанские значения

Проблема : Как подсчитать количество элементов в столбце DataFrame, которые не являются Нан ?

import pandas as pd

df = pd.read_csv("Cars.csv")

# Dataframe "df"
# ----------
#       make    fuel aspiration   body-style   price  engine-size
# 0     audi     gas      turbo        sedan   30000          2.0
# 1    dodge     gas        std        sedan   17000          1.8
# 2    mazda  diesel        std        sedan   17000          NaN
# 3  porsche     gas      turbo  convertible  120000          6.0
# 4    volvo  diesel        std        sedan   25000          2.0
# ----------

df.count()[5]
print(result)
# 4

Метод count () Возвращает количество не- Нан Значения для каждого столбца. DataFrame DF имеет пять рядов. Пятая колонна Содержит один Нан значение. Следовательно, количество пятой колонны – 4 Отказ

Падение nan-ценностей

Проблема : Как отбросить все строки, которые содержат Нан Значение в любом из его столбцов – и как ограничить это определенным столбцам?

import pandas as pd

df = pd.read_csv("Cars.csv")

# Dataframe "df"
# ----------
#       make    fuel aspiration   body-style   price  engine-size
# 0     audi     gas      turbo        sedan   30000          2.0
# 1    dodge     gas        std        sedan   17000          1.8
# 2    mazda  diesel        std        sedan   17000          NaN
# 3  porsche     gas      turbo  convertible  120000          6.0
# 4    volvo  diesel        std        sedan   25000          2.0
# ----------

selection1 = df.dropna(subset=["price"])
selection2 = df.dropna()
print(len(selection1), len(selection2))
# 5 4

DataFrame’s Dropna () Способ удаляет все строки, которые содержат Нан Значение в любом из его колонн. Но как ограничить столбцы, которые будут отсканированы для Нан значения?

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

Звонок Dropna () Без ограничения, капли линии 2 Из-за Нан Значение в столбце Размер двигателя Отказ Когда вы ограничиваете колонны только на Цена , никакие ряды не будут сброшены, потому что нет Нан Значение присутствует.

Западайте NAN и сброс индекс

Проблема : Что происходит с индексами после сброса определенных рядов?

import pandas as pd

df = pd.read_csv("Cars.csv")

# Dataframe "df"
# ----------
#       make    fuel aspiration   body-style   price  engine-size
# 0     audi     gas      turbo        sedan   30000          2.0
# 1    dodge     gas        std        sedan   17000          1.8
# 2    mazda  diesel        std        sedan   17000          NaN
# 3  porsche     gas      turbo  convertible  120000          6.0
# 4    volvo  diesel        std        sedan   25000          2.0
# ----------

df.drop([0, 1, 2], inplace=True)
df.reset_index(inplace=True)
result = df.index.to_list()
print(result)
# [0, 1]

Метод падение () На DataFrame удаляет строки или столбцы по индексу. Вы можете пройти одно значение или список значений.

По умолчанию в помещении Параметр установлен на Ложь Так что модификации не повлияют на исходный объект dataframe. Вместо этого метод возвращает модифицированную копию датафарама. В головоломке вы набор в помещении к Правда Таким образом, делеции выполняются непосредственно на DataFrame.

После удаления первых трех строк первые два метки индекса являются 3 и 4. Вы можете сбросить индексацию по умолчанию, вызывая метод RESET_INDEX () На DataFrame, чтобы индекс снова запускается в 0. Поскольку в DataFrame осталось только два ряда строк, результат – [0, 1] Отказ

Согласие разнородных данных, заполненных нан

Проблема Как объединить два данных данных, если у них есть разные столбцы?

import pandas as pd

df = pd.read_csv("Cars.csv")
df2 = pd.read_csv("Cars2.csv")

# Dataframe "df"
# ----------
#       make    fuel aspiration   body-style   price  engine-size
# 0     audi     gas      turbo        sedan   30000          2.0
# 1    dodge     gas        std        sedan   17000          1.8
# 2    mazda  diesel        std        sedan   17000          NaN
# 3  porsche     gas      turbo  convertible  120000          6.0
# 4    volvo  diesel        std        sedan   25000          2.0
# ----------

# Additional Dataframe "df2"
# ----------
#      make   origin
# 0   skoda  Czechia
# 1  toyota    Japan
# 2    ford      USA
# ----------

try:
    result = pd.concat([df, df2], axis=0, ignore_index=True)
    print("Y")
except Exception:
    print ("N")

# Y

Даже если данные Dataframes имеют разные столбцы, вы можете объединить их.

Если DataFrame 1 имеет столбцы A и B и DataFrame 2, имеет столбцы C и D, результат ConcateNation DataFrames 1 и 2 представляет собой DataFrame с столбцами A, B, C и D. Пропущенные значения в строках заполнены Нан Отказ

Внешнее слияние

Проблема : При объединении) две датаформы – что происходит, если есть отсутствующие значения?

import pandas as pd

df = pd.read_csv("Cars.csv")
df2 = pd.read_csv("Cars2.csv")

# Dataframe "df"
# ----------
#       make    fuel aspiration   body-style   price  engine-size
# 0     audi     gas      turbo        sedan   30000          2.0
# 1    dodge     gas        std        sedan   17000          1.8
# 2    mazda  diesel        std        sedan   17000          NaN
# 3  porsche     gas      turbo  convertible  120000          6.0
# 4    volvo  diesel        std        sedan   25000          2.0
# ----------

# Additional dataframe "df2"
# ----------
#     make   origin
# 0  skoda  Czechia
# 1  mazda    Japan
# 2   ford      USA
# ----------

result = pd.merge(df, df2, how="outer", left_on="make", right_on="make")
print(len(result["fuel"]))
print(result["fuel"].count())
# 7
# 5

С функцией панды Слияние () и параметр Как установить внешний , вы можете выполнить внешнее соединение Отказ

Полученное значение dataframe внешнего соединения содержит все значения из обоих входных данных; Отсутствующие значения заполнены Нан Отказ

Кроме того, эта головоломка показывает, как Нан Значения подсчитаны Лен () Функция, тогда как метод count () не включает Нан значения.

Замена нана

Проблема : Как заменить все Нан Значения в DataFrame с заданным значением?

import pandas as pd

df = pd.read_csv("Cars.csv")

# Dataframe "df"
# ----------
#       make    fuel aspiration   body-style   price  engine-size
# 0     audi     gas      turbo        sedan   30000          2.0
# 1    dodge     gas        std        sedan   17000          1.8
# 2    mazda  diesel        std        sedan   17000          NaN
# 3  porsche     gas      turbo  convertible  120000          6.0
# 4    volvo  diesel        std        sedan   25000          2.0
# ----------

df.fillna(2.0, inplace=True)
result = df["engine-size"].sum()
print(result)
# 13.8

Метод Fillna () заменяет Нан значения с новым значением. Таким образом, сумма всех значений в столбце Размер двигателя 13,8.

Длина против подсчета разницы – это нан!

Проблема : В чем разница между Лен () и то считать() Функции?

import pandas as pd

df = pd.read_csv("Cars.csv")
df2 = pd.read_csv("Cars2.csv")

# Dataframe "df"
# ----------
#       make    fuel aspiration   body-style   price  engine-size
# 0     audi     gas      turbo        sedan   30000          2.0
# 1    dodge     gas        std        sedan   17000          1.8
# 2    mazda  diesel        std        sedan   17000          NaN
# 3  porsche     gas      turbo  convertible  120000          6.0
# 4    volvo  diesel        std        sedan   25000          2.0
# ----------

# Additional dataframe "df2"
# ----------
#     make   origin
# 0  skoda  Czechia
# 1  mazda    Japan
# 2   ford      USA
# ----------

result = pd.merge(df2, df, how="left", left_on="make", right_on="make")
print(len(result["fuel"]))
print(result["fuel"].count())
# 3
# 1

В левом соединении левый DataFrame – это мастер, и все его значения включены в полученное значение dataframe.

Поэтому результат DataFrame содержит три ряда, поскольку Skoda и Форд Не появляйтесь в DataFrame DF только один ряд для Mazda содержит значение.

Опять же, мы видим разницу между использованием функции Лен () который также включает Нан Значения и метод count () который не считается Нан значения.

Равен () против сравнения NAN

Проблема:

import pandas as pd

df = pd.read_csv("Cars.csv")

# Dataframe "df"
# ----------
#       make    fuel aspiration   body-style   price  engine-size
# 0     audi     gas      turbo        sedan   30000          2.0
# 1    dodge     gas        std        sedan   17000          1.8
# 2    mazda  diesel        std        sedan   17000          NaN
# 3  porsche     gas      turbo  convertible  120000          6.0
# 4    volvo  diesel        std        sedan   25000          2.0
# ----------

df["engine-size_copy"] = df["engine-size"]
check1 = (df["engine-size_copy"] == df["engine-size"]).all()
check2 = df["engine-size_copy"].equals(df["engine-size"])
print(check1 == check2)
# False

Этот фрагмент кода показывает, как сравнивать столбцы или целые дата данных относительно формы и элементов.

Сравнение с использованием оператора == Возвращает Ложь Для нашего датафарама, потому что сравнение Нан -Валены с == всегда дает Ложь Отказ

С другой стороны, df.equals () позволяет сравнивать две серии или данных данных. В этом случае Нан -Валены в том же месте считаются равными.

Заголовки столбцов не должны иметь один и тот же тип, но элементы внутри столбцов должны быть одинакового dtype Отказ

С результата Check1 это Ложь и результат Check2 Урожайность Правда Окончательный выход – Ложь Отказ

Куда пойти отсюда?

Достаточно теории, давайте познакомимся!

Чтобы стать успешным в кодировке, вам нужно выйти туда и решать реальные проблемы для реальных людей. Вот как вы можете легко стать шестифункциональным тренером. И вот как вы польские навыки, которые вам действительно нужны на практике. В конце концов, что такое использование теории обучения, что никто никогда не нуждается?

Практические проекты – это то, как вы обостряете вашу пилу в кодировке!

Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?

Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.

Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.

Присоединяйтесь к свободному вебинару сейчас!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python One-listers (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.