
В Learning Data Analytics One: Using Python and Pandas , я рассказываю о:
Последние несколько дней я изучаю фильтрацию данных в DataFrame.
Давайте поговорим об этом.
Прежде чем мы начнем:
Вы можете получить доступ к данным и моим блокнотам на моем github .
Для кого эта статья лучше всего подходит?
Эта статья лучше всего подходит для новичков в аналитике данных - как и я, эта статья (и последующие серии статей) помогут вам.
Что мы будем рассматривать?
Я расскажу:
Давайте окунемся в это!

Во-первых, давайте импортируем pandas и прочитаем наш csv-файл.
# import pandas and give it an alias pd
import pandas as pd
# read csv file
students_performance_data = pd.read_csv('data/students-performance-data.csv')Вот как это выглядит в моем блокноте jupyter:

Мы можем выбрать столбец в DataFrame с помощью метки столбца.
Например, я хочу выбрать только пол в моем датафрейме.
gender = students_performance_data['gender']
Один столбец в датафрейме называется серией.
Мы можем проверить это с помощью функции type.

У серии нет метки столбца, но есть метка строки.

Вы также можете выбрать несколько столбцов в DataFrame. Это можно сделать, передав список меток столбцов.
Я собираюсь выбрать колонки labels gender, test_prep_course, math_score, reading_score и writing_score.
students_scores_data = students_performance_data[
[
'gender',
'test_prep_course',
'math_score',
'reading_score',
'writing_score'
]
]Вы можете выбрать один столбец в DataFrame, что даст вам объект Series. При выборе нескольких столбцов, как в приведенном выше коде, вы получите объект DataFrame.

Вот подмножество DataFrame, которое мы выбрали:

Функция sort_values() в DataFrame и Series позволяет сортировать данные.
Давайте рассмотрим несколько примеров.
Я хочу отсортировать данные по полу, но хочу видеть только 100 верхних строк.
students_score.sort_values(by=['gender']).head(100)

Параметр by функции sort_values() принимает список. Это позволяет сортировать данные по нескольким столбцам!
Здесь я сортирую данные по полу и математическому баллу.
students_score.sort_values(by=['gender', 'math_score']).head(100)

По умолчанию sort_values() сортирует данные в порядке возрастания, ascending=True. Вы можете отменить это, установив параметр ascending в False.
students_score.sort_values( by=['gender', 'math_score'], ascending=False ).head(100)

Параметр ascending функции sort_values() может также принимать список меток столбцов. При этом список меток столбцов, который вы передаете ему, должен совпадать с параметром by.
students_score[['gender', 'math_score']].sort_values(
by=['gender', 'math_score'],
ascending=[True, False]
)Бывают случаи, когда ваши данные содержат значения NaN (Not a Number). Вы можете использовать функцию sort_values(), чтобы увидеть все эти значения NaN. Это можно сделать, задав параметр na_position. По умолчанию na_position='last', но вы можете изменить это значение.
students_score.sort_values(
by=['gender', 'math_score'],
ascending=False,
na_position='first'
)
С помощью функции sort_values() можно сделать много интересного. Вы можете узнать больше об этом здесь.
Мы подробно рассмотрели выбор столбцов и сортировку данных. Теперь давайте рассмотрим, как можно фильтровать данные в DataFrame.
Краткий обзор операторов сравнения в python:

Вы можете использовать операторы сравнения для фильтрации данных в DataFrame.
Здесь я хочу получить всех студентов, чей math_score меньше 75.
students_score[students_score['math_score']<='75']

Подождите, почему 75 заключено в одинарную кавычку? Это делает его строкой, а не числом, да? Но когда я убираю одинарную кавычку, python выдает ошибку:
# this will throw an error students_score[students_score['math_score']<=75] # the error is: # TypeError: '<=' not supported between instances of 'str' and 'int'
Помните функцию DataFrame.info()? Вот когда она пригодится. Давайте проверим наш DataFrame и выясним, что является причиной вышеуказанной ошибки.
students_score.info()
Приведенный выше код отобразит типы данных каждого столбца нашего DataFrame.

Столбец math_score не является целым числом. Это объект. Это происходит потому, что в этом столбце есть значения NaN.
Давайте попробуем другой столбец. На этот раз возьмем всех студентов, чей балл по чтению меньше 75.
students_score[students_score['reading_score']<=75]
На этот раз мы не заключили число 75 в одинарную кавычку, потому что это целое число.
И получаем результат ниже:

Вот еще один пример:
Я хочу получить всех студентов, которые прошли подготовку к тесту, но чей балл по чтению меньше или равен 75, а по письму меньше 75.
students_score[
(students_score['test_prep_course'] =='completed') &
(students_score['reading_score']<=75) &
(students_score['writing_score']<75)
].head(10)
Функция isin() используется, если вы хотите получить строки данных с определенным списком значений. Я не думаю, что понял это правильно. Позвольте мне показать вам пример вместо этого.
Здесь я извлекаю всех студентов из групп B, C и D. Вместо того чтобы использовать несколько операторов сравнения - например, students_performance_data['ethnicity'] == 'группа B' & students_performance_data['ethnicity'] == 'группа C' и так далее - я использую функцию isin().
students_performance_data[
(students_performance_data['ethnicity'].isin(
['group B', 'group C', 'group D']
))
]Функция isna() используется для определения отсутствующих значений.
students_performance_data[
students_performance_data['math_score'].isna()
]
Свойства loc и iloc используются для доступа к группе строк и столбцов в вашем DataFrame.
Свойство loc используется для доступа к группе строк и столбцов с помощью метки столбца.
students_performance_data.loc[
:10,
['gender', 'test_prep_course', 'math_score']
]Приведенный выше код вернет первые 10 строк в моем DataFrame и только столбцы 'gender', 'test_prep_course', 'math_score'.

Вот еще один пример:
Вместо того чтобы использовать индекс для выбора строк, я использую сравнение для выбора строк и столбцов, которые я хочу увидеть.
students_performance_data.loc[
students_score['reading_score']<=65,
['gender', 'test_prep_course', 'reading_score']
]Свойство iloc используется для доступа к группе строк и столбцов с помощью индексов.
students_performance_data.iloc[0:10, 3:6]
Iloc выдаст ошибку, если вы укажете, например, метки столбцов.
# this will throw an error
students_performance_data.iloc[
0:10,
['gender', 'test_prep_course', 'reading_score']
]
IndexError: .iloc requires numeric indexers, got ['gender' 'test_prep_course' 'reading_score']Используйте функцию query() для фильтрации данных с помощью столбцов.
students_performance_data[
['gender', 'ethnicity', 'reading_score']
].query('ethnicity =="group B" & reading_score >= 95')Отлично!
Мы рассмотрели:
Я предполагаю, что есть больше методов в фильтрации DataFrame. Пока что я оставлю вас с этим. И, надеюсь, я смогу поделиться крошечными вещами о том, чему я научился.
Также, обратите внимание, что в нашем примере есть некорректные данные? Столбцы со значением NaN? На следующем занятии я собираюсь изучить, как очистить данные перед их обработкой. Я поделюсь с вами этим в следующей статье!

20.08.2023 18:21
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2026-2027 годах? Или это полная лажа?".

20.08.2023 17:46
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.

19.08.2023 18:39
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.
19.08.2023 17:22
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!

18.08.2023 20:33
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий их языку и культуре.

14.08.2023 14:49
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.