В 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 в 2023-2024 годах? Или это полная лажа?".
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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.