обработка данных
February 1, 2023

Два нетипичных способа выборки данных из датафрейма, имеющих ключевое значение

Создадим тестовый набор данных.

import pandas as pd

df = pd.DataFrame([[1,3,1], [1,44,64], [45,756,3]], index=['one', 'two', 'three'], 
                  columns=['val1', 'val2', 'val3'])
df

Сокращающая выборка по функции

Часто требуется вывод неких статистических данных из датасета. С Python в вашем распоряжении много возможностей, однако некоторые из инструментов помогут сделать это быстрее и без создания ненужных промежуточных этапов. Например, вывод значений из колонки встречающихся более двух раз:

df['val1'].value_counts()

С методом value_counts можно получить всю статистику, а затем выбрать строки с нужным количество повторений, однако существует и более короткий способ - использование выборки по функции, которая в качестве аргумента получает датафрейм или серию, на которых вызывается, и определяет логическое условие выборки:

df['val1'].value_counts().loc[lambda x: x>1]

Комбинированная индексация

Другой прием - комбинация индексации по позиции и названию. Рассмотрим пример, когда вам надо перезаписать часть датафрейма. При этом область определяется номерами строк и названиями колонок. Если делать это с последовательной выборкой, достичь цели не удастся ввиду знаменитого SettingWithCopyWarning:

from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler()

df.iloc[[0,1]][['val2', 'val3']] = sc.fit_transform(df.iloc[[0,1]][['val2', 'val3']])
df

В этом случае на помощь придет один из двух способов соединить два вида индексации. Так, чтобы сделать это с iloc, следует получить позиции колонок через метод get_indexer:

df.iloc[[0,1], df.columns.get_indexer(['val2', 'val3'])] = \
        sc.fit_transform(df.iloc[[0,1], df.columns.get_indexer(['val2', 'val3'])] )
df

Аналогичная манипуляция при индексации по названиям предполагает получение названий индексов через атрибут index:

df.loc[df.index[[0,1]], ['val2', 'val3']] = sc.fit_transform(
                    df.loc[df.index[[0,1]], ['val2', 'val3']])
df