В этом руководстве мы рассмотрим группировку и сортировку.

Карты позволяют нам преобразовывать данные в DataFrame или Series по одному значению за раз для всего столбца. Однако часто мы хотим сгруппировать наши данные, а затем сделать что-то конкретное для группы, в которой находятся данные.

Мы делаем это с помощью операции groupby().

Групповой анализ:

Мы можем воспроизвести то, что делает value_counts(), выполнив следующие действия:

reviews.groupby('points').points.count()

groupby() создал группу отзывов, в которых данным винам были присвоены одинаковые баллы. Затем для каждой из этих групп мы взяли столбец points() и подсчитали, сколько раз он появился. value_counts() — это просто ярлык для этой groupby() операции.

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

reviews.groupby('points').price.min()

Каждая группа, которую мы генерируем, представляет собой срез нашего DataFrame, содержащий только данные с совпадающими значениями. Этот DataFrame доступен нам напрямую с помощью метода apply(), и затем мы можем манипулировать данными любым способом, который сочтем нужным. Например, вот один из способов выбора названия первого проверенного вина каждой винодельни в наборе данных:

reviews.groupby('winery').apply(lambda df: df.title.iloc[0])

сначала мы используем groupby в столбце винодельни, это создаст группу для каждого элемента винодельни, затем мы применяем лямбда-функцию, которая извлекает первый заголовок данного DataFrame, созданного с помощью groupby.

Мы также можем группировать по более чем одному столбцу. Например, вот как мы выбираем лучшее вино по стране и провинции:

reviews.groupby(['country', 'province']).apply(lambda df: df.loc[df.points.idxmax()])

Вот как будет выглядеть новый фрейм данных:

Одним из лучших методов метода groupby() function является agg(), который позволяет вам одновременно запускать множество различных функций в вашем DataFrame. Например, мы можем создать простую статистическую сводку набора данных следующим образом:

reviews.groupby(['country']).price.agg([len, min, max])

Это добавит три столбца к результирующему фрейму данных, содержащему длину, минимум и максимум столбцов цены.

Сортировка:

Если мы напечатаем значения в countries_reviewed DataFrame, мы увидим, что группировка возвращает данные в порядке индекса, а не в порядке значений. То есть при выводе результата groupby порядок строк зависит от значений в индексе, а не в данных.

Чтобы получить данные в нужном порядке, мы можем отсортировать их самостоятельно. Для этого удобен метод sort_values():

# first we reset the index
countries_reviewed = countries_reviewed.reset_index()
# then we use the sort_values method that takes the "by" argument
# specifying the feature we are going to use to arrange the values
countries_reviewed.sort_values(by='len', ascending=False)

Восходящий аргумент ( по умолчанию True ) позволяет нам указать порядок сортировки.

Для сортировки по значениям индекса используйте сопутствующий метод sort_index(). Этот метод имеет те же аргументы и порядок по умолчанию:

countries_reviewed.sort_index()

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

countries_reviewed.sort_values(by=['country', 'len'])