Обработка отсутствующих значений Pandas | легко играть с Pandas (3)

искусственный интеллект Python анализ данных pandas

Учить вас, как изучать панд, не моя цель,Моя цель — научить вас легко играть в панд.. Я познакомлю вас с очками знаний Pandas через ряд примеров, чтобы вам не было скучно на пути к изучению Pandas.

Отказ от ответственности: что я написалЛегко играть Учебники Pandas бесплатны, если это поможет вам, вы можете продолжать следовать за мной.

существуетПодробное объяснение основных функций Pandas | Легко играть в Pandas (2)Представляет некоторые часто используемые функции в Pandas, чтобы у нас было общее представление об использовании Pandas. В этой главе мы рассмотрим, как обрабатывать пропущенные значения с помощью Pandas.

# 导入相关库
import numpy as np
import pandas as pd

какое значение отсутствует

Прежде чем понять, как обрабатываются пропущенные значения (также называемые элементами управления), первое, что нужно знать, это то, что такое пропущенные значения? интуитивно понятно,Пропущенные значения представляют «отсутствующие данные».

Вы можете подумать над вопросом: что вызывает пропущенные значения? На самом деле причин много: в реальной жизни данные могут отсутствовать из-за неполных данных, или данные могут отсутствовать из-за неправильной работы, или данные могут отсутствовать искусственно.

Взгляните на наш пример.

index = pd.Index(data=["Tom", "Bob", "Mary", "James", "Andy", "Alice"], name="name")

data = {
    "age": [18, 30, np.nan, 40, np.nan, 30],
    "city": ["BeiJing", "ShangHai", "GuangZhou", "ShenZhen", np.nan, " "],
    "sex": [None, "male", "female", "male", np.nan, "unknown"],
    "birth": ["2000-02-10", "1988-10-17", None, "1978-08-08", np.nan, "1988-10-17"]
}

user_info = pd.DataFrame(data=data, index=index)

# 将出生日期转为时间戳
user_info["birth"] = pd.to_datetime(user_info.birth)
user_info
age birth city sex
name
Tom 18.0 2000-02-10 BeiJing None
Bob 30.0 1988-10-17 ShangHai male
Mary NaN NaT GuangZhou female
James 40.0 1978-08-08 ShenZhen male
Andy NaN NaT NaN NaN
Alice 30.0 1988-10-17 unknown

Как видите, пол пользователя ТомаNone, возраст пользователя МарииNAN, чей день рожденияNaT. В глазах панд это все пропущенные значения и их можно использоватьisnull()илиnotnull()метод работы.

user_info.isnull()
age birth city sex
name
Tom False False False True
Bob False False False False
Mary True True False False
James False False False False
Andy True True True True
Alice False False False False

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

user_info[user_info.age.notnull()]
age birth city sex
name
Tom 18.0 2000-02-10 BeiJing None
Bob 30.0 1988-10-17 ShangHai male
James 40.0 1978-08-08 ShenZhen male
Alice 30.0 1988-10-17 unknown

отбросить пропущенные значения

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

user_info.age.dropna()
name
Tom      18.0
Bob      30.0
James    40.0
Alice    30.0
Name: age, dtype: float64

Серийное использованиеdropnaОтносительно просто, для DataFrame можно задать больше параметров.

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

howНеобязательное значение параметраany(по умолчанию) илиall.anyУказывает, что любой элемент в строке/столбце пуст и отброшен.allОтбрасывается, когда все значения в строке/столбце пусты.

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

threshПараметр имеет целочисленный тип, и его действие, например,thresh=3, сохранит строку/столбец, если в ней есть как минимум 3 ненулевых значения.

# 一行数据只要有一个字段存在空值即删除
user_info.dropna(axis=0, how="any")
age birth city sex
name
Bob 30.0 1988-10-17 ShangHai male
James 40.0 1978-08-08 ShenZhen male
Alice 30.0 1988-10-17 unknown
# 一行数据所有字段都为空值才删除
user_info.dropna(axis=0, how="all")
age birth city sex
name
Tom 18.0 2000-02-10 BeiJing None
Bob 30.0 1988-10-17 ShangHai male
Mary NaN NaT GuangZhou female
James 40.0 1978-08-08 ShenZhen male
Alice 30.0 1988-10-17 unknown
# 一行数据中只要 city 或 sex 存在空值即删除
user_info.dropna(axis=0, how="any", subset=["city", "sex"])
age birth city sex
name
Bob 30.0 1988-10-17 ShangHai male
Mary NaN NaT GuangZhou female
James 40.0 1978-08-08 ShenZhen male
Alice 30.0 1988-10-17 unknown

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

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

fillnaИмя, по-видимому, используется для заполнения пропущенных значений.

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

user_info.age.fillna(0)
name
Tom      18.0
Bob      30.0
Mary      0.0
James    40.0
Andy      0.0
Alice    30.0
Name: age, dtype: float64

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

Настройка параметровmethod='pad'илиmethod='ffill'можно использовать предыдущий有效值заполнять.

user_info.age.fillna(method="ffill")
name
Tom      18.0
Bob      30.0
Mary     30.0
James    40.0
Andy     40.0
Alice    30.0
Name: age, dtype: float64

Настройка параметровmethod='bfill'илиmethod='backfill'можно использовать последний有效值заполнять.

user_info.age.fillna(method="backfill")
name
Tom      18.0
Bob      30.0
Mary     40.0
James    40.0
Andy     30.0
Alice    30.0
Name: age, dtype: float64

кроме как черезfillnaметод для заполнения пропущенных значений, вы также можете передатьinterpolateспособ заполнения. Линейная разница используется по умолчанию, может быть установленаmethodпараметры, чтобы изменить способ.

user_info.age.interpolate()
name
Tom      18.0
Bob      30.0
Mary     35.0
James    40.0
Andy     35.0
Alice    30.0
Name: age, dtype: float64

заменить отсутствующие значения

Вы когда-нибудь задумывались над вопросом: что именно является недостающим значением? Вы можете задаться вопросом, разве это уже не было сказано раньше,None,np.nan,NaTЭто все пропущенные значения. Но я также сказал, что это пропущенные значения в глазах панд, а иногда и в наших глазах некоторые выбросы также рассматриваются как пропущенные значения.

Например, в нашей сохраненной информации о пользователях, предполагая, что мы ограничиваем пользователей всеми молодыми людьми, и появляется возраст 40 лет, мы можем считать это выбросом. Другой пример, мы все знаем, что пол делится на мужской и женский.При записи пола пользователя, неизвестный пол пользователя записывается как «неизвестный».Очевидно, мы также можем думать, что «неизвестный» отсутствует значение. Также иногда появляются пустые строки, которые также можно считать отсутствующими значениями.

Для приведенного выше случая мы можем использоватьreplaceспособ замены пропущенных значений.

user_info.age.replace(40, np.nan)
name
Tom      18.0
Bob      30.0
Mary      NaN
James     NaN
Andy      NaN
Alice    30.0
Name: age, dtype: float64

Также можно указать словарь отображения.

user_info.age.replace({40: np.nan})
name
Tom      18.0
Bob      30.0
Mary      NaN
James     NaN
Andy      NaN
Alice    30.0
Name: age, dtype: float64

Для DataFrame вы можете указать значение для замены для каждого столбца.

user_info.replace({"age": 40, "birth": pd.Timestamp("1978-08-08")}, np.nan)
age birth city sex
name
Tom 18.0 2000-02-10 BeiJing None
Bob 30.0 1988-10-17 ShangHai male
Mary NaN NaT GuangZhou female
James NaN NaT ShenZhen male
Andy NaN NaT NaN NaN
Alice 30.0 1988-10-17 unknown

Точно так же мы можем заменить определенные строки, например: заменить «неизвестно».

user_info.sex.replace("unknown", np.nan)
name
Tom        None
Bob        male
Mary     female
James      male
Andy        NaN
Alice       NaN
Name: sex, dtype: object

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

user_info.city.replace(r'\s+', np.nan, regex=True)
name
Tom        BeiJing
Bob       ShangHai
Mary     GuangZhou
James     ShenZhen
Andy           NaN
Alice          NaN
Name: city, dtype: object

Заполнить другими объектами

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

Например, если есть две серии о возрасте пользователя, в одной есть пропущенные значения, а в другой нет, мы можем передать элементы серии без пропущенных значений элементам с пропущенными значениями.

age_new = user_info.age.copy()
age_new.fillna(20, inplace=True)
age_new
name
Tom      18.0
Bob      30.0
Mary     20.0
James    40.0
Andy     20.0
Alice    30.0
Name: age, dtype: float64
user_info.age.combine_first(age_new)
name
Tom      18.0
Bob      30.0
Mary     20.0
James    40.0
Andy     20.0
Alice    30.0
Name: age, dtype: float64

Видно, что отсутствующие значения о возрасте в информации о пользователе заполняются серией age_new.


Чтобы узнать больше об искусственном интеллекте, обратите внимание на общедоступный номер:Фракция ИИ

qrcode_for_gh_60cef389e81c_258.jpg

Здесь я упорядочиваю содержание всей статьи в формате pdf, и те, кто хочет файл в формате pdf, могут ответить на ключевые слова в фоновом режиме официального аккаунта:pandas03.

Для получения дополнительной информации о пандах см.:Играйте с пандами с легкостью