Что такое Pandas
Pandas — это открытая библиотека для Python, которая позволяет специалистам (в основном аналитикам данных/дата-сайентистам) работать с информацией: например, фильтровать, агрегировать и сортировать ее. Внутри себя Pandas содержит две структуры данных:
- Series — это одномерный массив, который может состоять из элементов различных типов (например, строки/числа). Каждый элемент имеет индекс, который может быть числовым (по умолчанию) и строковым.
Пример создания Series:
import pandas as pd
# Здесь указываются строковые индексы — если не указывать их, то они будут проставлены
# автоматически (начиная с 0)
data_series = pd.Series([31, 28, 31, 30], index=['Январь', 'Февраль', 'Март', 'Апрель'])
data_series # Вывод на экран
Результат будет выглядеть примерно так:
Январь | 31 |
Февраль | 28 |
Март | 31 |
Апрель | 30 |
- DataFrame — двумерный массив, визуально похожий на таблицу, в которой элементы также могут быть разных типов, а столбцы и строки имеют свои индексы.
Пример создания DataFrame:
data = {
'Вид': ['Собака', 'Кошка', 'Собака', 'Попугай'],
'Имя': ['Бусинка', 'Дуся', 'Шарик', 'Кеша'],
'Возраст': [2, 4, 1, 15]
}
df = pd.DataFrame(data)
df # Вывод на экран
Результат:
Вид | Имя | Возраст |
Собака | Бусинка | 2 |
Кошка | Дуся | 4 |
Собака | Шарик | 1 |
Попугай | Кеша | 15 |
Для доступа к элементам используются методы. iloc (для доступа по индексу начиная с 0) и .loc (когда значение индекса, например, «Январь» известно):
# 1 — это индекс строки, а 2 — столбца
print(df.iloc[1, 2])
# Вывод: 4
# С помощью «:» выбираются все строки, далее выбираются столбцы
print(df.loc[:, ['Имя', 'Возраст']])
Результат:
Имя | Возраст |
Бусинка | 2 |
Дуся | 4 |
Шарик | 1 |
Кеша | 15 |
Способы сортировки данных
В Pandas для сортировки используется метод sort_values(), его синтаксис выглядит следующим образом:
DataFrame.sort_values(by, *, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)
Рассмотрим каждый параметр метода:
- by (обязательный) — принимает строку/список строк: имя или список имен столбцов, по которым будут сортироваться значения;
- axis — принимает два аргумента: 0 (по умолчанию) или 1. Если передан 0, то данные будут сортироваться по столбцам, а если 1 — по значениям строк;
- ascending — принимает два аргумента: True (по умолчанию) или False. При True результат упорядочивается по возрастанию, при False — по убыванию. Если в by передано несколько аргументов, то для каждого из них аргументы ascending могут быть разными;
- inplace — также принимает True или False (по умолчанию). При True будет изменяться указанный DataFrame, при False будет создан новый объект;
- kind — определяет алгоритм сортировки: quicksort (по умолчанию), mergesort, heapsort, stable;
- na_position — определяет, где будут расположены NaN-значения: если передано last (по умолчанию), то в конце, а если first — в начале;
- ignore_index — принимает True или False (по умолчанию). При False индексы сохраняются, при True заменяются на 0, 1, 2 и так далее;
- key — принимает функцию, которую нужно предварительно применить к значениям (по умолчанию None — функция не указана).
Также существует метод sort_index() — он сортирует значения по индексам. Синтаксис метода:
DataFrame.sort_index(*, axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, ignore_index=False, key=None)
Здесь появилось два новых параметра:
- level — определяет уровень индекса, принимает целое число, или список чисел, или строку (имя индекса), или список строк;
- sort_remaining — принимает True (по умолчанию) или False. При True сортировка будет проводиться по всем уровням (после того как она проведена по указанному), при False — только по указанному.
Примеры использования сортировки данных
Для того чтобы рассмотреть примеры, создадим исходную таблицу с информацией о студентах (то есть создадим DataFrame):
import pandas as pd
data = {
'Имя': ['Анна', 'Виктор', 'Виталий', 'Дарья', 'Елена'],
'Возраст': [23, 21, 22, 23, 22],
'Оценка': [88, 95, 70, 85, 91],
'Город': ['Москва', 'Санкт-Петербург', 'Новосибирск', 'Москва', 'Новосибирск']
}
students_df = pd.DataFrame(data)
Она будет выглядеть следующим образом (столбца «Индекс» в таблице нет, здесь он добавлен для лучшего понимания примеров):
Индекс | Имя | Возраст | Оценка | Город |
0 | Анна | 23 | 88 | Москва |
1 | Виктор | 21 | 95 | Санкт-Петербург |
2 | Виталий | 22 | 70 | Новосибирск |
3 | Дарья | 23 | 85 | Москва |
4 | Елена | 22 | 91 | Новосибирск |
Начнем с простого — отсортируем таблицу по оценкам:
students_df.sort_values(by='Оценка')
Итог:
Имя | Возраст | Оценка | Город |
Виталий | 22 | 70 | Новосибирск |
Дарья | 23 | 85 | Москва |
Анна | 23 | 88 | Москва |
Елена | 22 | 91 | Новосибирск |
Виктор | 21 | 95 | Санкт-Петербург |
По умолчанию ascending=True, поэтому значения отсортированы по возрастанию. Изменяем значение этого параметра:
students_df.sort_values(by='Оценка', ascending=False)
получаем результат:
Имя | Возраст | Оценка | Город |
Виктор | 21 | 95 | Санкт-Петербург |
Елена | 22 | 91 | Новосибирск |
Анна | 23 | 88 | Москва |
Дарья | 23 | 85 | Москва |
Виталий | 22 | 70 | Новосибирск |
Далее можно отсортировать таблицу по возрасту и оценке, при этом возраст — по возрастанию, а оценки — по убыванию:
students_df.sort_values(by=['Возраст', 'Оценка'], ascending=[True, False])
Результат:
Имя | Возраст | Оценка | Город |
Виктор | 21 | 95 | Санкт-Петербург |
Елена | 22 | 91 | Новосибирск |
Виталий | 22 | 70 | Новосибирск |
Анна | 23 | 88 | Москва |
Дарья | 23 | 85 | Москва |
Можно заметить, что студент с оценкой 70 оказался в середине таблицы, хотя должен был оказаться внизу. Так произошло из-за того, что первым столбцом в by указан возраст, а значит, в первую очередь данные сортируются именно по нему.
Чтобы рассмотреть работу параметра na_position, сделаем копию таблицы и изменим одно из значений на None:
students_df_with_nan = students_df.copy()
# Изменение значения в строке с индексом 2 и столбце «Оценка»
students_df_with_nan.loc[2, 'Оценка'] = None
Теперь оценка Виталия не указана, отсортируем таблицу по оценкам, помещая NaN-значения в начало:
students_df_with_nan.sort_values(by='Оценка', na_position='first')
Результат:
Имя | Возраст | Оценка | Город |
Виталий | 22 | NaN | Новосибирск |
Дарья | 23 | 85 | Москва |
Анна | 23 | 88 | Москва |
Елена | 22 | 91 | Новосибирск |
Виктор | 21 | 95 | Санкт-Петербург |
Каждая строка исходной таблицы имеет индекс (первая строка — индекс 0, вторая — 1 и так далее). Во всех примерах выше эти индексы сохранялись, но при необходимости это можно изменить:
students_df.sort_values(by='Оценка', ascending=False, ignore_index=True)
Результат (столбец с индексами добавлен для иллюстрации работы параметра ignore_index):
Индекс | Имя | Возраст | Оценка | Город |
0 | Виктор | 21 | 95 | Санкт-Петербург |
1 | Елена | 22 | 91 | Новосибирск |
2 | Анна | 23 | 88 | Москва |
3 | Дарья | 23 | 85 | Москва |
4 | Виталий | 22 | 70 | Новосибирск |
Далее рассмотрим работу параметра key: в исходной таблице данные уже нормализованы, однако так бывает не всегда — например, некоторые имена могут быть записаны с маленькой буквы:
students_df_with_nan = students_df.copy()
students_df_with_nan.loc[2, 'Имя'] = 'виталий'
В таком случае можно отсортировать данные без учета регистра:
students_df_with_nan.sort_values(by='Имя', key=lambda col: col.str.lower())
В результате таблица будет отсортирована по именам (по алфавиту):
Имя | Возраст | Оценка | Город |
Анна | 23 | 88 | Москва |
Виктор | 21 | 95 | Санкт-Петербург |
виталий | 22 | 70 | Новосибирск |
Дарья | 23 | 85 | Москва |
Елена | 22 | 91 | Новосибирск |
Сортировка по индексам (метод sort_index()) работает подобным образом. Например, чтобы отсортировать таблицу по индексам по возрастанию, достаточно написать следующий код:
students_df.sort_index()
Если изменить значение ascending на False:
students_df.sort_index(ascending=False)
то в результате вернется «перевернутая» таблица:
Имя | Возраст | Оценка | Город |
Елена | 22 | 91 | Новосибирск |
Дарья | 23 | 85 | Москва |
Виталий | 22 | NaN | Новосибирск |
Виктор | 21 | 95 | Санкт-Петербург |
Анна | 23 | 88 | Москва |
Главное
- Pandas — это библиотека для Python, которая содержит две структуры данных: Series и DataFrame.
- Для доступа к элементам используются методы. loc и .iloc.
- Существует два основных метода для сортировки: sort_values() (по значениям) и sort_index() (по индексам).