Фильтрация данных в Pandas

машинное обучение глубокое обучение компьютерное зрение NLP

Автор|Аманда Иглесиас Морено Компилировать|ВКонтакте Источник | К науке о данных

Фильтрация данных из фрейма данных — одна из самых распространенных операций при очистке данных. Pandas предоставляет ряд методов для выбора данных на основе позиций и меток строк и столбцов. Кроме того, Pandas позволяет получать подмножества данных на основе типов столбцов и фильтровать строки с помощью логических индексов.

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

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

Кроме того, мы предоставим несколько примеров кодирования!

набор данных

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

Фрейм данных содержит информацию о 10 сотрудниках компании: (1) удостоверение личности, (2) имя, (3) фамилия, (4) отдел, (5) номер телефона, (6) зарплата, (7) контракт. тип.

import pandas as pd

# 员工的信息
id_number = ['128', '478', '257', '299', '175', '328', '099', '457', '144', '222']
name = ['Patrick', 'Amanda', 'Antonella', 'Eduard', 'John', 'Alejandra', 'Layton', 'Melanie', 'David', 'Lewis']
surname = ['Miller', 'Torres', 'Brown', 'Iglesias', 'Wright', 'Campos', 'Platt', 'Cavill', 'Lange', 'Bellow']
division = ['Sales', 'IT', 'IT', 'Sales', 'Marketing', 'Engineering', 'Engineering', 'Sales', 'Engineering', 'Sales']
salary = [30000, 54000, 80000, 79000, 15000, 18000, 30000, 35000, 45000, 30500]
telephone = ['7366578', '7366444', '7366120', '7366574', '7366113', '7366117', '7366777', '7366579', '7366441', '7366440']
type_contract = ['permanent', 'temporary', 'temporary', 'permanent', 'internship', 'internship', 'permanent', 'temporary', 'permanent', 'permanent']

# 包含员工信息的dataframe
df_employees = pd.DataFrame({'name': name, 'surname': surname, 'division': division,
                             'salary': salary, 'telephone': telephone, 'type_contract': type_contract}, index=id_number)

df_employees

1. Выберите один столбец по метке

Чтобы выбрать столбец в Pandas, мы можем использовать оператор . и оператор [].

Выбрать один столбец по метке

df[string]

В приведенном ниже коде используются оба метода для доступа к столбцу зарплаты.

# 使用.符号选择列(salary)
salary = df_employees.salary

# 使用方括号选择列(salary)
salary_2 = df_employees['salary']

# 当选择单个列时,我们获得一个Series对象
print(type(salary))
# <class 'pandas.core.series.Series'>

print(type(salary_2))
# <class 'pandas.core.series.Series'>

salary

Как показано выше, при извлечении одного столбца результатом является объект Series. Чтобы получить объект DataFrame, когда выбран только один столбец, нам нужно передать список, а не только строку.

# 通过向索引操作符传递一个字符串来获取一个Series对象
df_employees['salary']

# 通过将带有单个项的列表传递给索引操作符来获取DataFrame对象
df_employees[['salary']]

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


2. Выберите несколько столбцов по метке

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

Выбрать несколько столбцов по метке

df[list_of_strings]
# 通过将包含列名的列表传递给索引操作符来选择多个列
df_employees[['division', 'salary']]

Как показано выше, результатом является объект DataFrame, содержащий только столбцы, представленные в списке.

3. Выберите столбцы по типу данных

Мы можем использовать pandas.DataFrame.select type(include=None, exclude=None) для выбора столбцов на основе их типа данных. Метод принимает список или один тип данных в параметрах включения и исключения.

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

Выбрать столбцы по типу данных

df.select_dtypes(include=None, exclude=None)

В приведенном ниже примере мы передаемnp.numberобъект добавляется в параметр include. Кроме того, мы можем сделать это, предоставив строку 'number' в качестве входных данных, чтобы получить тот же результат.

Как видите, метод select_dtypes() возвращает объект DataFrame, который включает типы данных в параметре include и исключает типы данных в параметре exclude.

import numpy as np

# 选择数值列- numpy对象
numeric_inputs = df_employees.select_dtypes(include=np.number)

# 使用.columns属性
numeric_inputs.columns
# Index(['salary'], dtype='object')

# 该方法返回一个DataFrame对象
print(type(numeric_inputs))
# <class 'pandas.core.frame.DataFrame'>

# 选择数字列
numeric_inputs_2 = df_employees.select_dtypes(include='number')

# 使用.columns属性
numeric_inputs_2.columns
# Index(['salary'], dtype='object')

# 该方法返回一个DataFrame对象
print(type(numeric_inputs_2))
# <class 'pandas.core.frame.DataFrame'>

# 可视化数据框
numeric_inputs

Как упоминалось ранее, метод select_dtypes() может принимать как строки, так и объекты numpy в качестве входных данных. В следующей таблице показаны наиболее распространенные способы обращения к типам данных в Pandas.

Напоминаем, что мы можем использовать метод pandas.DataFrame.info или использовать свойство pandas.DataFrame.dtypes. Первый выводит краткую сводку фрейма данных, включая имена столбцов и их типы данных, а второй возвращает последовательность, содержащую тип данных каждого столбца.

# 数据框架的简要摘要,包括列名及其数据类型
df_employees.info()

# 检查列的数据类型
df_employees.dtypes

4. Выберите одну строку по метке

Кадры данных и последовательности не обязательно имеют числовые индексы. По умолчанию индекс представляет собой целое число, представляющее позицию строки, однако он также может быть буквенно-цифровой строкой. В нашем текущем примере индекс — это идентификационный номер сотрудника.

# 我们可以使用.index方法检查数据帧的索引
df_employees.index
# Index(['128', '478', '257', '299', '175', '328', '099', '457', '144', '222'], dtype='object')
# 索引是雇员的id号。

Чтобы выбрать строку по номеру идентификатора, мы можем использовать индексатор .loc[], чтобы предоставить строку (имя индекса) в качестве входных данных.

Выбрать одну строку по метке

df.loc[string]

В приведенном ниже коде показано, как выбрать сотрудника с идентификационным номером 478.

# 使用.loc[]索引器选择id号为478的员工
df_employees.loc['478']

Как показано выше, при выборе строки индексатор .loc[] возвращает объект Series. Однако мы также можем получить фрейм данных с одной строкой, передав список из одного элемента методу .loc[], как показано ниже.

# 使用.loc[]索引器选择id号为478的雇员,并提供一个单元素列表
df_employees.loc[['478']]

5. Выберите несколько строк по метке

Мы можем выбрать несколько строк, используя индексатор .loc[]. В дополнение к одному тегу индексатор принимает в качестве входных данных список или фрагмент тега.

Выбрать несколько строк по метке

df.loc[list_of_strings]
df.loc[slice_of_strings]

Затем мы получаем подмножество фрейма данных, содержащего сотрудников с идентификационными номерами 478 и 222, как показано ниже.

# 使用.loc[]索引器选择id号为478和222的员工
df_employees.loc[['478', '222']]

Обратите внимание, что конечный индекс метода .loc[] всегда включается, что означает, что выбор включает последнюю метку.

6. Выберите одну строку по положению

Индексатор iloc[] используется для индексации фрейма данных по положению. Чтобы выбрать одну строку с помощью свойства .iloc[], мы передаем индексатору позицию строки (одно целое число).

Выбрать одну строку по позиции

df.iloc[integer]

В блоке кода ниже мы выбираем строку с индексом 0. В этом случае возвращается первая строка кадра данных, поскольку индексация начинается с 0 в Pandas.

# 选择数据帧的第一行
df_employees.iloc[0]

Кроме того, индексатор .iloc[] также поддерживает отрицательные целые числа (начиная с -1) в качестве относительного положения относительно конца фрейма данных.

# 选择数据帧的最后一行
df_employees.iloc[-1]

Как показано выше, при выборе строки индексатор .iloc[] возвращает объект Series, индексированный по имени столбца. Однако, как и в случае с индексатором .loc[], мы также можем получить фрейм данных, передав индексатору один список целых чисел следующим образом.

# 选择数据帧的最后一行
df_employees.iloc[[-1]]

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

# 数据框的形状- 10行6列
df_employees.shape
# (10, 6)

# 当试图访问一个越界的索引时,会引发一个IndexError
df_employees.iloc[10]
# IndexError

7. Выберите из нескольких мест

Чтобы извлечь несколько строк по положению, мы передаем список или объект среза индексатору .iloc[].

Выберите несколько строк по местоположению

df.iloc[list_of_integers]
df.iloc[slice_of_integers]

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

# 使用列表选择dataframe的前5行
df_employees.iloc[[0, 1, 2, 3, 4]]v

В качестве альтернативы мы можем использовать нотацию среза, чтобы получить тот же результат.

# 使用切片选择dataframe的前5行
df_employees.iloc[0:5]

Как показано выше, правила нарезки Python (полуоткрытые интервалы) применяются к атрибуту .iloc[], что означает, что включается первый индекс, но не конечный индекс.

8. Выберите и строки, и столбцы

Итак, мы узнали, как использовать индексаторы .loc[] и .iloc[] для выбора строк во фрейме данных по метке или положению. Однако два индексатора могут одновременно выбирать не только строки, но и строки и столбцы.

Для этого мы должны указать метки/местоположения строк и столбцов, разделенные запятыми, например:

Выберите и строки, и столбцы

df.loc[row_labels, column_labels]
df.iloc[row_positions, column_positions]

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

В следующем примере показано, как использовать индексаторы .loc[] и .iloc[] для извлечения как строк, так и столбцов.

  • выберите скалярное значение

Выбираем зарплату сотрудника с id 478 следующим образом.

# 按位置选择身份证号为478的员工的工资
df_employees.iloc[1, 3]

# 根据标签选择id号为478的员工的工资
df_employees.loc['478', 'salary']
# 54000

В этом примере выходные данные обоих индексаторов являются целыми числами.

  • Выбрать одну строку и несколько столбцов

Мы выбираем имя, фамилию и зарплату сотрудника с идентификационным номером 478, передавая значение в качестве первого аргумента и список значений в качестве второго аргумента, в результате чего получается объект Series.

# 按职位选择身份证号为478的员工的姓名、姓氏和工资
df_employees.iloc[1, [0, 1, 3]]

# 通过标签选择身份证号为478的员工的姓名、姓氏和工资
df_employees.loc['478', ['name', 'surname', 'salary']]

  • Выбрать непересекающиеся строки и столбцы

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

# 按职位选择身份证号为478和222的员工的姓名、姓氏和工资
df_employees.iloc[[1, 9], [0, 1, 3]]

# 根据标签选择身份证号为478和222的员工的姓名、姓氏和工资
df_employees.loc[['478', '222'], ['name', 'surname', 'salary']]

В отличие от предыдущих, выходные данные обоих индексаторов представляют собой объект DataFrame.

  • Выбрать последовательные строки и столбцы

Мы можем извлечь последовательные строки и столбцы фрейма данных, используя нотацию среза. Фрагмент кода ниже показывает, как выбрать имя, фамилию и зарплату сотрудников с идентификационными номерами 128, 478, 257 и 299.

# 按职位选择id号为128、478、257、299的员工的姓名、姓氏和工资
df_employees.iloc[:4, [0, 1, 3]]

# 按标签选择id号为128、478、257、299的员工的姓名、姓氏和工资
df_employees.loc[:'299', ['name', 'surname', 'salary']]

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

Важно помнить, что индексатор .loc[] использует закрытый интервал, извлекая как начальную, так и конечную метки. Напротив, индексатор .iloc[] использует полуоткрытые интервалы, поэтому значение конечного индекса не включается.

9. Используйте индексаторы .at[] и .iat[] для выбора скалярных значений.

Как упоминалось выше, мы можем выбрать скалярные значения, передав две строки/целые числа, разделенные запятыми, индексаторам .loc[] и .iloc[]. Кроме того, Pandas предоставляет две оптимизированные функции для извлечения скалярных значений из объектов dataframe: операторы .at[] и .iat[]. Первый извлекает одно значение по метке, а второй обращается к одному значению по положению.

Выберите скалярное значение по метке и положению

df.at[string, string]
df.iat[integer, integer]

В приведенном ниже коде показано, как использовать индексаторы .at[] и .iat[] для выбора зарплаты сотрудника с идентификационным номером 478 по метке и местоположению.

# 按位置选择身份证号为478的员工的工资
df_employees.iat[1, 3]

# 根据标签选择id号为478的员工的工资
df_employees.at['478', 'salary']
# 54000

Мы можем использовать волшебную функцию **%timeit** для вычисления времени выполнения этих двух операторов Python. Как показано ниже, операторы .at[] и .iat[] намного быстрее, чем индексаторы .loc[] и .iloc[].

# loc索引器的执行时间
%timeit df_employees.loc['478', 'salary']

# at索引器的执行时间
%timeit df_employees.at['478', 'salary']

# iloc索引器的执行时间
%timeit df_employees.iloc[1, 3]

# iat索引器的执行时间
%timeit df_employees.iat[1, 3]

Наконец, следует помнить, что индексаторы .at[] и .iat[] могут использоваться только для доступа к одному значению и вызовут ошибку TypeError при попытке выбрать несколько элементов фрейма данных.

# 当尝试选择多个元素时,会引发异常
df_employees.at['478', ['name', 'surname', 'salary']]
# TypeError

10. Используйте логическое значение для выбора строк

До сих пор мы фильтровали строки и столбцы в фрейме данных на основе меток и позиций. В качестве альтернативы мы также можем использовать логическое индексирование для выбора подмножества в Pandas. Логический выбор включает в себя выбор строк фрейма данных путем предоставления каждой строке логического значения (True или False).

В большинстве случаев этот логический массив вычисляется путем применения условия к значениям одного или нескольких столбцов, которое оценивается как True или False, в зависимости от того, удовлетворяют ли эти значения условию. Однако логические массивы также можно создавать вручную с использованием других последовательностей, массивов Numpy, списков или серий Pandas.

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

Выберите строку, используя логический выбор выбора

df[sequence_of_booleans]
Логический выбор на основе значения одного столбца

Самый распространенный способ фильтрации фрейма данных на основе одного столбца значений — использование операторов сравнения.

Операторы сравнения вычисляют отношение между двумя операндами (A и b) и возвращают значение True или False в зависимости от того, выполняется ли условие. Следующая таблица содержит операторы сравнения, доступные в Python.

Эти операторы сравнения можно использовать в одном столбце фрейма данных для получения последовательности логических значений. Например, мы используем оператор «больше», чтобы определить, превышает ли зарплата сотрудника 45 000, как показано ниже.

# 工资超过45000的员工
df_employees['salary'] > 45000

Результатом является серия логических функций, где зарплата больше 45000 true и меньше или равна 45000 false. Как вы, наверное, заметили, логическая серия имеет тот же индекс (идентификационный номер), что и исходный фрейм данных.

Эту последовательность можно передать оператору индекса [] для возврата только тех строк, результат которых равен True.

# 选择工资高于45000的员工
df_employees[df_employees['salary'] > 45000]

Как показано выше, мы получаем объект dataframe, который содержит только сотрудников с зарплатой выше 45000.

Логический выбор на основе нескольких значений столбца

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

В Python есть три логических оператора: и, или, и не. Однако эти ключевые слова недоступны в Pandas для объединения нескольких логических условий. Вместо этого используйте следующие операторы.

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

# 选择工资高于45000并有长期合同的员工
df_employees[(df_employees['salary'] > 45000) & (df_employees['type_contract'] == 'permanent')]

Как вы знаете, в Python операторы сравнения имеют более высокий приоритет, чем логические операторы. Однако это не работает с пандами, где логические операторы имеют приоритет над операторами сравнения. Поэтому нам нужно заключить каждое логическое выражение в круглые скобки, чтобы избежать ошибок.

Логический выбор с использованием метода Pandas

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

  • Изин метод

Метод pandas.Series.isin принимает последовательность значений и возвращает True в той позиции в последовательности, которая соответствует значению в списке.

Этот метод позволяет нам проверить наличие одного или нескольких элементов в столбце без использования логического оператора ИЛИ. В приведенном ниже коде показано, как использовать логический оператор или и метод isin для выбора сотрудников с постоянными или временными контрактами.

# 使用逻辑操作符或选择具有永久或临时合同的员工
df_employees[(df_employees['type_contract'] == 'temporary') | (df_employees['type_contract'] == 'permanent')]

# 使用isin方法选择有永久或临时合同的员工
df_employees[df_employees['type_contract'].isin(['temporary', 'permanent'])]

Как видите, метод isin очень удобен при проверке нескольких условий ИЛИ в одном столбце. Кроме того, это быстрее!

# 使用逻辑运算符|执行时间
%timeit df_employees[(df_employees['type_contract'] == 'temporary') | (df_employees['type_contract'] == 'permanent')]

# isin方法的执行时间
%timeit df_employees[df_employees['type_contract'].isin(['temporary', 'permanent'])]

между методом

Этот метод серии pandas принимает два скаляра, разделенных запятыми, представляющих верхнюю и нижнюю границы диапазона значений, и возвращает True в позиции внутри этого диапазона.

Следующий код выбирает сотрудников с зарплатой больше или равной 30000 и меньше или равной 80000.

# 薪资高于或等于30000,低于或等于80000的员工
df_employees[df_employees['salary'].between(30000, 80000)]

Как видите, обе границы (30000 и 80000) включены. Чтобы исключить их, мы должны передать параметр inclusive=False следующим образом.

# 薪资在3万以上,8万以下的员工
df_employees[df_employees['salary'].between(30000, 80000, inclusive=False)]

Как вы могли заметить, приведенный выше код эквивалентен написанию двух логических выражений и их вычислению с использованием логического оператора и .

# 薪资高于或等于30000,低于或等于80000的员工
df_employees[(df_employees['salary']>=30000) & (df_employees['salary']<=80000)]
  • строковый метод

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

Например, метод pandas.Series.str.contains проверяет наличие подстрок во всех элементах столбца и возвращает серию логических значений, которые мы можем передать оператору индексации для фильтрации фрейма данных.

В приведенном ниже коде показано, как выбрать все телефонные номера, содержащие 57.

# 选择所有包含57的电话号码
df_employees[df_employees['telephone'].str.contains('57')]

Когда метод contains вычисляет, содержится ли подстрока в каждом элементе последовательности. Функция pandas.Series.str.startswith проверяет, существует ли подстрока в начале строки. Аналогично, pandas.Series.str.endswith проверяет наличие подстроки в конце строки.

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

# 选择名字以“A”开头的员工
df_employees[df_employees['name'].str.startswith('A')]

Резюме

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

Оригинальная ссылка:к data science.com/filtering-the…

Добро пожаловать на сайт блога Panchuang AI:panchuang.net/

sklearn машинное обучение китайские официальные документы:sklearn123.com/

Добро пожаловать на станцию ​​сводки ресурсов блога Panchuang:docs.panchuang.net/