Получить проценты для столбца на основе другого столбца, но с другими категориями - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть следующие серии панд:

                    Count
Pclass  Survived    
1       0            80
        1           136
2       0            97
        1            87
3       0           372
        1           119

Но я хочу что-то вроде этого:

                    Count   Percentage
Pclass  Survived       
1       0           80      37.0
        1           136     63.0
2       0           97      52.7
        1           87      47.3
3       0           372     75.8
        1           119     24.2

Я хочу рассчитать проценты, основываясь только на количестве в каждой категорииPclass (не вся сумма отсчетов).Было бы здорово, если бы эти проценты рассчитывались с использованием только столбца Count.

До сих пор я суммировал подсчеты в соответствии с Pclass и использовал .repeat () для дублирования значений и пытался объединитьэто к оригинальной серии, которая провалилась эффектно.

        Count
Pclass  
1       216
1       216
2       184
2       184
3       491
3       491

Моя идея состояла в том, чтобы использовать этот столбец повторения в качестве знаменателей при расчете процентов, например:

80 / 216 * 100 = 37.0%

, а затем удалить столбец повторения после вычисления процентов.Кажется так просто, но я не могу заставить его работать.Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Вы работаете над набором титановых данных.Вы также можете сделать, как показано ниже, для исходных данных (не для вашей Серии выше):

df.Survived.groupby(df.Pclass).value_counts(normalize=True)*100

Это даст вам счет каждого класса в процентах, а не в фактическом количестве.

0 голосов
/ 27 сентября 2018

div и sum с level=0

df.assign(Pct=df.div(df.sum(level=0), level=0).round(2) * 100)

                 Count   Pct
Pclass Survived             
1      0            80  37.0
       1           136  63.0
2      0            97  53.0
       1            87  47.0
3      0           372  76.0
       1           119  24.0
0 голосов
/ 27 сентября 2018

Используйте GroupBy.transform для возврата Series с тем же размером, что и оригинал DataFrame, делите на div, кратное mulи при необходимости round:

#if input is Series create one column DataFrame
df = s.to_frame('Count')

s = df.groupby('Pclass')['Count'].transform('sum')
#if use oldier pandas version
#s = df.groupby(level='Pclass')['Count'].transform('sum')

df['Percentage'] = df['Count'].div(s).mul(100).round()
print (df)
                 Count  Percentage
Pclass Survived                   
1      0            80        37.0
       1           136        63.0
2      0            97        53.0
       1            87        47.0
3      0           372        76.0
       1           119        24.0

РЕДАКТИРОВАТЬ:

Вам не нужно пересылать заполнение на PClass?

В этом нет необходимости, потому что по умолчанию в MultiIndex не отображаются, но если установлено multi_sparse в False, можно проверить повторяющиеся значения:

with pd.option_context('display.multi_sparse', False):
    print (df)
                 Count
Pclass Survived       
1      0            80
1      1           136
2      0            97
2      1            87
3      0           372
3      1           119
...