2015-08-14 6 views
1

У меня сводная таблица в фрейме данных, и я бы хотел рассчитать проценты групп.Добавление процента столбца группы в python pandas

, например: Sample pivot data

и что мне нужно: desired output

Я exluded исходные данные, но я бы ожидать, чтобы иметь это, и я знаю, что нужно добавить в этих столбцах ,

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

ответ

1

Ваш пример на самом деле не показывает, что находится в вашем индексе, а нет.

Я сделал свой собственный набор данных:

df = pd.DataFrame({'country':["NL"]*9, 'team':["A"]*3+["B"]*3+["C"]*3, 'outcome':["WIN", "LOSE", "DRAW"] * 3, 'week1':[2,3,4,4,5,2,4,4,2], 'week2':[3,2,5,2,3,4,2,3,4], 'week3':[4,5,2,3,2,5,3,2,5]}) 
df.set_index(['country', 'team'], inplace=True) 

Обратите внимание, что я сделал Team C, а также. Поскольку две команды В не имеют смысла. Я предположил, что это была ошибка.

На моем примере, вы можете просто сделать:

df_percent = df/df.groupby(level=[0,1]).sum() 
df_percent['outcome'] = df['outcome'] 

      outcome  week1  week2  week3 
country team          
NL  A  WIN 0.222222 0.300000 0.363636 
     A  LOSE 0.333333 0.200000 0.454545 
     A  DRAW 0.444444 0.500000 0.181818 
     B  WIN 0.363636 0.222222 0.300000 
     B  LOSE 0.454545 0.333333 0.200000 
     B  DRAW 0.181818 0.444444 0.500000 
     C  WIN 0.400000 0.222222 0.300000 
     C  LOSE 0.400000 0.333333 0.200000 
     C  DRAW 0.200000 0.444444 0.500000 
0

Разделить dataframe по сумме числа игр в стране и команды, полученные с использованием groupby и реорганизован с помощью transform.

df = pd.DataFrame({'country': ["NL"] * 9, 
        'team': ["A"] * 3 + ["B"] * 3 + ["C"] * 3, 
        'outcome': ["WIN", "LOSE", "DRAW"] * 3, 
        'week1': [2, 3, 4, 4, 5, 2, 4, 4, 2], 
        'week2': [3, 2, 5, 2, 3, 4, 2, 3, 4], 
        'week3': [4, 5, 2, 3, 2, 5, 3, 2, 5]}) 
df.set_index(['country', 'team', 'outcome'], inplace=True) 

>>> df.divide(df.reset_index().groupby(['country', 'team']).transform(sum).values) 
         week1  week2  week3 
country team outcome        
NL  A WIN  0.222222 0.300000 0.363636 
      LOSE  0.333333 0.200000 0.454545 
      DRAW  0.444444 0.500000 0.181818 
     B WIN  0.363636 0.222222 0.300000 
      LOSE  0.454545 0.333333 0.200000 
      DRAW  0.181818 0.444444 0.500000 
     C WIN  0.400000 0.222222 0.300000 
      LOSE  0.400000 0.333333 0.200000 
      DRAW  0.200000 0.444444 0.500000 

Чтобы сделать это более понятным, вы можете увидеть, что делает transform. Он возвращает результаты в той же форме, что и исходный фрейм данных.

>>> df.reset_index().groupby(['country', 'team']).transform(sum).values 
array([[ 9, 10, 11], 
     [ 9, 10, 11], 
     [ 9, 10, 11], 
     [11, 9, 10], 
     [11, 9, 10], 
     [11, 9, 10], 
     [10, 9, 10], 
     [10, 9, 10], 
     [10, 9, 10]]) 

Вы также можете использовать transform в методе, предложенном @firelynx и пропустить его последний шаг:

>>> df.divide(df.groupby(level=[0,1]).transform(sum)) 

         week1  week2  week3 
country team outcome        
NL  A WIN  0.222222 0.300000 0.363636 
      LOSE  0.333333 0.200000 0.454545 
      DRAW  0.444444 0.500000 0.181818 
     B WIN  0.363636 0.222222 0.300000 
      LOSE  0.454545 0.333333 0.200000 
      DRAW  0.181818 0.444444 0.500000 
     C WIN  0.400000 0.222222 0.300000 
      LOSE  0.400000 0.333333 0.200000 
      DRAW  0.200000 0.444444 0.500000 

 Смежные вопросы

  • Нет связанных вопросов^_^