Skip to Content
Жора К

8 мин чтения


Заметки о библиотеке pandas

Хочу поделится статьей со шпаргалками, набором команд и принципов, которые как мне кажется не являются очевидными после прочтения Getting Started документации и могут быть полезны тем кто иногда пользуется этой библиотекой. Создано после прохождения 30 days of Pandas Challange, ссылки на мои решения можно найти на сайте по ссылке


Введение

Библиотека pandas — невероятно полезный инструмент для обработки и анализа структурированных данных на языке программирования Python, который позволяет легко импортировать, манипулировать и агрегировать данные, что делает его незаменимым для задач анализа данных. Для того чтобы начать работу с библиотекой стоит ознакомиться с официальной документацией pandas. Полезная двустраничная шпаргалка с набором команд находится в официальной документации по ссылке - добавьте ее себе в закладки. В этой статье я хочу сделать обзор челенджа 30 days of Pandas от LeetCode, чтобы выделить и сохранить наглядные примеры использования методов манипулирования данными и посмотреть как данные методы извлечения данных в pandas соотносятся с такими же механизмами SQL.

image

Обзор

Давате погрузимся в возможности библиотеки Pandas с помощью этой статьи и рассмотрим часто используемые паттерны манипулирования данными. Будем рассматривать Pandas по следующим пунктам - обзор библиотеки, сравнение SQL и темы из челленджа:

  • Фильтрация данных
  • Строковые методы
  • Манипуляция данными
  • Агрегирование данных
  • Интеграция данных

Что такое DataFrame

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

import pandas as pd
subjects_data = {'Subject': ['Mathematics', 'Computer Science', 'Literature'],
                 'Units': [4, 3, 2],
                 'Level': ['Advanced', 'Intermediate', 'Beginner']}
subjects_df = pd.DataFrame(subjects_data)

Класс DataFrame в Pandas реализует подход к взаимодействию с табличными данными. Поскольку у него есть переопределение для __getitem__, то можно использовать оператор скобок ([]), чтобы получить из него данные. Например, можно использовать строковый ключ с именем столбца, чтобы получить его df['column']. Внутри скобок можно помещать объекты разных типов: строка, итерируемый объект(список), срез и т.д.

Выборка и фильтрация данных

Рассмотрим выборку строк и столбцов из DataFrame. Выбор одного столбца с использованием операции скобок возвращающее <class 'Series'>:

subject_column = df['Subject']
#0         Math
#1      Physics
#2      History
#3    Chemistry
#Name: Subject, dtype: object

Выборка нескольких колонок как <class 'DataFrame'>:

subset_data = df[['Subject', 'Units']]
#N      Subject  Units
#0       Math      4
#1    Physics      3
#2    History      3
#3  Chemistry      4

Выборка обной строки как <class 'Series'> с помощью функции loc:

zero_row = df.loc[0]
#Subject       Math
#Units            4
#Difficulty    Hard
#Name: 0, dtype: object

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

subject = df.at[1, 'Subject']
#Physics

Различные способы получения значения ячейки по столбку и строке с помощью функций loc, iloc, at, iat:

subject = df.at[0, 'Subject']
subject = df.iat[0, 0]
 
subject = df.loc[0].loc['Subject']
subject = df.loc[0].iloc[0]
 
subject = df.loc[0].at['Subject']
subject = df.loc[0].iat[0]
 
#Все вызовы возвращают 'Math'

Разница между iat и at (а также loc и iloc) заключается в том, что i* функции по порядковому номеру строки в индексоной колонке, а at и loc непосредственно по значению индекса. Так как по умолчанию индексами как раз являются целые неотрицательные числа, то использование этих двух видов функций будет эквивалентно. Однако если в качестве индекса будет использоваться другие значения (например строки), то вызов таких функций будет возвращать ошибку. После получения объекта Series со значениями строк df.loc[0], мы получаем объект, в котором имена колонок используются в качетве индексов, таким образом здесь можно использовать следущую конструкцию df.loc[0].loc[0].

Также функци .loc и .iloc можно использовать передавая в параметры слайсы:

#Здесь выбираются строки с 1 по 3 (включительно) и все столбцы
subset_df = df.loc[1:3, :]
#Выборка строк с 1 по 3 и столбцов 'Subject' и 'Difficulty'
subset_df = df.loc[1:3, ['Subject', 'Difficulty']]

Выбор строки по условию — выбор строк, в которых Units больше 3 в качестве объекта <class 'DataFrame'>

high_credit_subjects = df[df['Units'] > 3]
#N      Subject  Units Difficulty
#0       Math      4       Hard
#3  Chemistry      4   Moderate

Выбор строки на основе нескольких условий — выбор строк, в которых Units больше 3, а Difficulty равно Hard, как объект <class 'DataFrame'>

hard_subjects = df[(df['Units'] > 3) & (df['Difficulty'] == 'Hard')]
#N   Subject  Units Difficulty
#0    Math      4       Hard

Логические операции с DataFrame

Перед тем как перейти к рассмотрению логических операций в pandas давайте подробнее рассмотрим как работает скобочный оператор [] (brackets operation) с объектами DataFrame. Логические операции со столбцами DataFrame возвращают класс Series с результатом использованной операции. Например: после вызова этой строчки кода bool_series = df['Units'] > 3 в bool_series будет записан объект типа <class pandas.core.series.Series> со значением

#0     True
#1     True
#2    False
#3    False
#4     True
#Name: age, dtype: bool

И после этого мы могли бы использовать Series для фильтрации нашего DataFrame.

unit_3_df = df[df['Units'] > 3]
#или
unit_3_df = df[bool_series]
 
#N      Subject  Units Difficulty
#0       Math      4       Hard
#3  Chemistry      4   Moderate

Затем мы можем применять к этим объектам обычные булевые операции как к обычной матрице.

Булевые объекты Series могут использоваться как параметры в функциях loc/iloc.

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

  • & (Оператор И): объединяет два условия поэлементно и возвращает True, если оба условия истинны. напримерdf[(df['Column1'] > 5) & (df['Column2'] == 'Value')]
  • | (Оператор ИЛИ): объединяет два условия поэлементно и возвращает True, если хотя бы одно из условий истинно. например df[(df['Column1'] > 5) | (df['Column2'] == 'Value')]
  • ~ (Оператор НЕ): инвертирует логические значения, возвращая True, если условие ложно. например df[~(df['Column1'] > 5)]
  • ^ (Оператор XOR): применяет функцию xor. например df[~(df['Column1'] > 5)]
  • isnull(), notnull() функции: например. фильтрация строк, в которыз 'Difficulty' является null null_difficulty_courses = df[df['Difficulty'].isnull()]
  • isin() функция
  • any(), all() функции: например filtered_df = df[df['Subject'].isin(['Math', 'Physics])]

Строковые функции

Для того чтобы быстро манипулировать столбцами с типом dtype="string" можно использовать различные строковые функции вместо использования вызовой .apply на DataFrame. Вот несколько примеров таких функци:

  • df['Subject'] = df['Subject'].str.capitalize()
  • df['Subject'] = df['Subject'].str.lower()
  • df['Subject'] = df['Subject'].str.upper()
  • df['Subject'] = df['Subject'].str.len()
  • df['Subject'] = df['Subject'].str.replace('$M', 'm', regex=True)
  • df['Subject'].str.match(pattern)
  • df['Subject'].str.contains(pattern)
  • больше примеров строковых функций можно найти в оффициальной документации pandas

Манипуляция данными

В Pandas, обновление данных в DataFrames можно производить различными способами, и вот некоторые полезные из них.

Обновление значения всех полей в столбце с помощью литерала или арифметических операций с существующими столбцами:

  • df['Column'] = 2
  • df['Column'] = df['Column'] * 2

Обновление значений используя функции .at[], .iat[], .loc[] и .iloc[]. Они используются для получения и изменения значения обной ячейки в DataFrame:

  • df.at[0, 'Subject'] = "New Subject"
  • df.loc[df['Column'] > 5, 'Column'] = new_value

Добавление или изменения столбцов с помощью функций .apply(), .assign(), .insert():

  • df['Column'] = df['Column'].apply(lambda x: function(x)) применение функции к каждому элементу, столбцу или строке в DataFrame
  • df = df.assign(NewColumn=new_values) создание или изменение столбцов с использованием уже сущестуующих
  • df.insert(loc=2, column='NewColumn', value=new_values) вставка нового столбца

NOTE: Параметр `inplace=True`

Параметр inplace в pandas используется для указания, следует ли выполнять операцию изменяя существующий объект или возвращать новый. Если для параметра inplace установлено значение True, изменения вносятся непосредственно в исходный объект, а возвращается значение None. Если для параметра inplace установлено значение False (по умолчанию), возвращается новый объект с изменениями, а исходный объект остается неизменным.

Использование параметра inplace:

  • df.at[0, 'Column'].update(10, inplace=True) Обновление элемента используя параметр inplace
  • df.drop(columns='Column', inplace=True) Удаление столбца
  • df['Column'].replace(to_replace=1, value=100, inplace=True) Изменение значения в существующем DataFrame
  • df['Column'].apply(lambda x: x * 2, inplace=True) Применение функции к существующему объекту

image