Два нетипичных способа выборки данных из датафрейма, имеющих ключевое значение
Создадим тестовый набор данных.
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