Но они все равно вам пригодятся

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

(Если вы не читали мою предыдущую статью о функции группировки, продолжайте. Это поможет вам быстрее понять эту статью.)



Узнайте, как освоить функцию groupby в Python прямо сейчас
GroupBy в Pandas намного сложнее и мощнее, чем groupby в SQL. кdatascience.com



1. Процент по каждой группе

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

>>> import pandas as pd
>>> df = pd.DataFrame({'A':['a','b','c']*2,
...                    'B':['d','e']*3,
...                    'C':[1,3,6,10,12,16]
...                    })
>>> df
   A  B   C
0  a  d   1
1  b  e   3
2  c  d   6
3  a  e  10
4  b  d  12
5  c  e  16
# First Groupby 
>>> df['Perc_gpby_A'] = df.groupby('A')['C'].apply(lambda x: x/x.sum())
# Second Groupby
>>> df['Perc_gpby_B'] = df.groupby('B')['C'].apply(lambda x: x/x.sum())
>>> df
   A  B   C  Perc_gpby_A  Perc_gpby_B
0  a  d   1     0.090909     0.052632
1  b  e   3     0.200000     0.103448
2  c  d   6     0.272727     0.315789
3  a  e  10     0.909091     0.344828
4  b  d  12     0.800000     0.631579
5  c  e  16     0.727273     0.551724

Основным ключевым моментом из приведенного выше примера является то, что вы выбираете соответствующий уровень группировки в функции groupby. В первом операторе groupby уровень группировки - столбец A. Всего существует три группы: a, b и c. Затем столбец C будет применен с лямбда-функцией. Лямбда-функция x/x.sum(). Следовательно, каждое значение в столбце C будет разделено на сумму соответствующей группы. Например, сумма для группы a равна 11. Следовательно, в строках 0 и 3 значение c будет разделено на 11. Таким образом, результат будет 0,0909 и 0,9091. То же самое для оставшихся двух групп в столбце A и втором операторе groupby.

Помимо использования лямбда-функции, использование transform также может выполнять аналогичные вычисления.

>>> df['Perc_gpby_A'] = df['C']/df.groupby('A')['C'].transform('sum')
>>> df['Perc_gpby_B'] = df['C']/df.groupby('B')['C'].transform('sum')
>>> df
   A  B   C  Perc_gpby_A  Perc_gpby_B
0  a  d   1     0.090909     0.052632
1  b  e   3     0.200000     0.103448
2  c  d   6     0.272727     0.315789
3  a  e  10     0.909091     0.344828
4  b  d  12     0.800000     0.631579
5  c  e  16     0.727273     0.551724

2. Преобразовать в list / dict

Это то, о чем мой друг спросил несколько дней назад. Если вы хотите сгруппировать все значения в одной группе в виде списка или словаря, этот раздел даст вам ответ.

>>> df = pd.DataFrame({'A':['a','b','c']*2,
...                    'B':['d','e']*3,
...                    'C':[1,3,6,10,12,16]
...                    })
>>> df.groupby('A')['C'].apply(list)
A
a    [1, 10]
b    [3, 12]
c    [6, 16]
Name: C, dtype: object
>>> type(df.groupby('A')['C'].apply(list))
<class 'pandas.core.series.Series'>

В приведенном выше примере после groupby('A') apply(list) группирует все значения в ту же группу, что и форма списка. Окончательный результат представлен в виде серии. На этом уровне вы можете в дальнейшем преобразоваться в список или диктант.

>>> df.groupby('A')['C'].apply(list).to_list()
[[1, 10], [3, 12], [6, 16]]
>>> df.groupby('A')['C'].apply(list).to_dict()
{'a': [1, 10], 'b': [3, 12], 'c': [6, 16]}

Конечно, вы также можете выбрать setin applyfunction.

>>> df.groupby('B')['C'].apply(set).to_dict()
{'d': {1, 12, 6}, 'e': {16, 10, 3}}

3. Наиболее распространенное значение по группам

>>> df = pd.DataFrame({'A':list('ab'*4),
...                    'B':list('c'*2+'d'+'e'*5)})
>>> df
   A  B
0  a  c
1  b  c
2  a  d
3  b  e
4  a  e
5  b  e
6  a  e
7  b  e
>>> df.groupby('A')['B'].agg(pd.Series.mode)
A
a    e
b    e
Name: B, dtype: object

Я не думаю, что здесь нужно много объяснений. С agg(pd.Series.mode) вы можете получить наиболее частое значение для каждой группы.

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

Другие мои статьи о Python

Вы говорите людям, что вы новичок в Python, если задаете этот вопрос.

Добавьте это в закладки, если вы новичок в Python (особенно если вы изучаете Python самостоятельно)

Веб-парсинг Twitter с помощью Python Selenium (Часть 1)

Веб-парсинг Twitter с помощью Python Selenium (Часть 2)