Учить вас, как изучать панд, не моя цель,Моя цель — научить вас легко играть в панд.. Я познакомлю вас с очками знаний 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.
Чтобы узнать больше об искусственном интеллекте, обратите внимание на общедоступный номер:Фракция ИИ
Здесь я упорядочиваю содержание всей статьи в формате pdf, и те, кто хочет файл в формате pdf, могут ответить на ключевые слова в фоновом режиме официального аккаунта:pandas03.
Для получения дополнительной информации о пандах см.:Играйте с пандами с легкостью