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 4DataFrame’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 и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.