Как .apply работает с Pandas DataFrame.groupby? - PullRequest
2 голосов
/ 29 мая 2020
              Count
League  Result         
EPL     H      16
        D      9
        A      10
Champ   H      67
        D      15
        A      57
        H      87
La Liga D      35
        A      40
        

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

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

df.groupby("League").apply(lambda g: (g/g.sum()*100)

На первый взгляд это имело смысл, но что именно здесь g? Я предположил, что это был счет H, D или A, а затем g.sum() суммировал все счета H, D, A, сгруппированные по каждому делению. Но если g - это просто значение, как мы вызываем метод g.sum()? Что именно здесь g?

Ответы [ 2 ]

3 голосов
/ 29 мая 2020

g - это DataFrame. Поскольку вы группируете по 'League', вы разделите DataFrame на отдельные части, которые содержат уникальные значения 'League'. Чтобы проиллюстрировать это, мы можем перебрать объект GroupBy.

for idx, g in df.groupby('League'):  # `idx` is the unique group key
    print(g, '\n')

               Count
League Result       
Champ  H          67
       D          15
       A          57
       H          87

               Count
League Result       
EPL    H          16
       D           9
       A          10

                Count
League  Result       
La Liga D          35
        A          40

Затем apply применяет вашу функцию к каждому из этих DataFrame отдельно. Набрав g.sum(), вы получите Ряд, который суммирует каждый столбец в группе.

for idx, g in df.groupby('League'):
    print(g.sum(), '\n')

Count    226
dtype: int64 

Count    35
dtype: int64 

Count    75
dtype: int64 
1 голос
/ 29 мая 2020

Обычно мы делаем transform

df.Count=df.Count*100/df.groupby(level=0)['Count'].transform('sum')

g в вашей функции - это фрейм данных

df.groupby(level=0).apply(lambda  x : type(x))
Out[607]: 
League
Champ      <class 'pandas.core.frame.DataFrame'>
EPL        <class 'pandas.core.frame.DataFrame'>
La Liga    <class 'pandas.core.frame.DataFrame'>
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...