Зарегистрируйтесь, чтобы продолжить обучение

Работа с индексами Python: Pandas

Фильтрация значений и оперирование с их подмножествами используются в задачах обработки, подготовки и анализа данных. В этом уроке мы познакомимся c правилами индексирования основных объектов Series и DataFrame, а также узнаем, как с их помощью осуществлять подвыборки нужных строк и столбцов в табличных данных.

Структура объекта DataFrame

Рассмотрим объект DataFrame. Он состоит из набора столбцов, каждый из которых является объектом Series:

import pandas as pd

df_orders = pd.read_excel('./data/Orders.xlsx')
print(df_orders.head())
# => shop_1 shop_2  shop_3  shop4
# 0   7.0     1      7.0      8
# 1   4.0     2      4.0      5
# 2   3.0     5      NaN      3
# 3   8.0    12      8.0      7
# 4  15.0    11     13.0      9

Применим функцию type() к столбцу df_orders:

print(type(df_orders['shop_1']))
# => pandas.core.series.Series

Объект Series спроектирован, чтобы хранить одномерные структуры данных. Он состоит из двух связанных между собой массивов: меток и значений:

print(df_orders.shop_1)
# => 0     7.0
#    1     4.0
#    2     3.0
#    3     8.0
#    4    15.0
#    5    21.0
#    6     NaN
#    Name: shop_1, dtype: float64

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

print(df_orders[['shop_1','shop_2']].head())
# => shop_1 shop_2
#  0   7.0    1
#  1   4.0    2
#  2   3.0    5
#  3   8.0   12
#  4  15.0   11
#

При выборе нескольких столбцов мы будем снова получать тип данных DataFrame.

Иногда легче выбросить несколько столбцов, чем перечислять необходимые. В этом случае нужно использовать метод drop():

print(df_orders.drop(['shop_4'], axis=1).head())
# => shop_1 shop_2  shop_3
# 0   7.0     1      7.0
# 1   4.0     2      4.0
# 2   3.0     5      NaN
# 3   8.0    12      8.0
# 4  15.0    11     13.0

В методе drop() нужно задавать значение параметра axis. Значение 0 будет указывать, что нужно исключить некоторые строки. Значение 1 указывает на исключение столбцов.

Метод drop() возвращает новый объект DataFrame и оставляет без изменений исходный.

Индексы объектов DataFrame и Series

У каждой строки объекта DataFrame или значения у Series есть индекс. Индекс может быть как числом, так и строкой. Список индексов объектов DataFrame и Series можно получить с помощью атрибута index:

print(df_orders.index)
# RangeIndex(start=0, stop=7, step=1)
print(df_orders.shop_1.index)
# RangeIndex(start=0, stop=7, step=1)

Если нужно, можно изменить значение индексов и имя столбца с индексами:

df_orders.index = range(0,16,2)
df_orders.index.name = 'New indexes'
print(df_orders.head())
# =>          shop_1    shop_2  shop_3  shop4
# New indexes
#          0    7.0       1      7.0      8
#          2    4.0       2      4.0      5
#          4    3.0       5      NaN      3
#          6    8.0      12      8.0      7
#          8    15.0     11     13.0      9

Строковые индексы обычно называют метки или ключи:

df_orders.index = ['a','b','c','d','e','f','g']
print(df_orders.head())
# => shop_1 shop_2  shop_3  shop_4
# a    7.0    1      7.0      8
# b    4.0    2      4.0      5
# c    3.0    5      NaN      3
# d    8.0   12      8.0      7
# e   15.0   11     13.0      9

Методы получения значений по индексу

Разберем следующие методы:

  • loc() — метод выбора данных на основе меток строк
  • iloc() — метод выбора строк согласно их числовой позиции

loc()

Выберем одну строку из объекта DataFrame по ее метке:

print(df_orders.loc['b'])
# => shop_1    4.0
#    shop_2    2.0
#    shop_3    4.0
#    shop_4    5.0
# Name: b, dtype: float64

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

print(df_orders.loc[['b','c']])
# => shop_1 shop_2  shop_3  shop_4
# b   4.0     2      4.0      5
# c   3.0     5      NaN      3

iloc()

Выберем одну строку:

print(df_orders.iloc[1])
# => shop_1    4.0
#    shop_2    2.0
#    shop_3    4.0
#    shop_4    5.0
# Name: b, dtype: float64

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

print(df_orders.iloc[[1,2]])
# => shop_1 shop_2  shop_3  shop_4
# b   4.0     2      4.0      5
# c   3.0     5      NaN      3

Фильтрация строк и столбцов одновременно

Методы loc() и iloc() позволяют выполнять фильтрацию по строкам и столбцам одновременно. Пример для loc():

print(df_orders.loc[['b','c'],['shop_2','shop_4']])
# => shop_2 shop_4
#  b    2   5
#  c    5   3

Пример для iloc():

print(df_orders.iloc[[2,4],[1,3]])
# => shop_2 shop4
#  c    5   3
#  e    11  9

Как и при использовании методов отдельно для строк и столбцов, метод loc() ожидает на вход метки, а iloc() — номера позиций строк и столбцов.

Срезы

Срезы позволяют получать совокупности строк в определенном диапазоне. Пример:

print(df_orders.loc['b':'d'])
# =>  shop_1    shop_2  shop_3  shop_4
#  b    4.0       2       4.0     5
#  c    3.0       5       NaN     3
#  d    8.0      12       8.0     7

В срез данных попали все строки между позициями 1 и 3 включительно. Позиции 1 и 3 соответствуют меткам 'b' и 'd'. Можно строить более интересные срезы:

print(df_orders.loc['b':'f':2])
# => shop_1 shop_2  shop_3  shop_4
# b    4.0    2      4.0      5
# d    8.0   12      8.0      7
# f   21.0   18     17.0     21

В данный срез попала каждая вторая строка между строками с метками 'b' и 'f'.

Можно получать срезы со строками и столбцами одновременно:

print(df_orders.loc['b':'f':2, 'shop_1':'shop_3'])
# => shop_1 shop_2  shop_3
# b   4.0     2      4.0
# d   8.0    12      8.0
# f  21.0    18     17.0

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

Аналогично получаются срезы с помощью метода iloc(). Приведем пример, который совпадает по результату с примером выше:

print(df_orders.iloc[1:6:2, 0:3])
# b   4.0     2      4.0
# d   8.0    12      8.0
# f  21.0    18     17.0

Выводы

Работа с данными может производиться над конкретными элементами, строками, столбцами или их комбинациями. В этом уроке мы познакомились с фильтрацией значений таблиц по индексам строк и столбцов объекта DataFrame библиотеки Pandas. Изложенные методы позволяют получать различные срезы данных в соответствии с условиями на индексы.


Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

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

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 24 542 ₸ в месяц
новый
Сбор, анализ и интерпретация данных
9 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»