2016-12-22 5 views
2

У меня возникла следующая проблема. У меня есть dataframe с множественным индексом (три здесь):Pandas div с несколькими индексами

df = pd.DataFrame(np.random.randint(2, 8, size = (8, 1))) 
df.index = pd.MultiIndex.from_tuples([(1990, 'Women','type_A'), (1990, 'Women','type_B'),(1990, 'Men','type_A'), (1990, 'Men','type_B'), 
(1991, 'Women','type_A'), (1991, 'Women','type_B'),(1991, 'Men','type_A'), (1991, 'Men','type_B')]) 
df.index.names = ['Year', 'Gender','Type'] 
df.columns = ['Total'] 

, который выглядит как:

     Total 
Year Gender Type   
1990 Women type_A  5 
      type_B  7 
    Men type_A  6 
      type_B  2 
1991 Women type_A  2 
      type_B  6 
    Men type_A  3 
      type_B  5 

Я пытался вычислить долю каждого Type и Gender по Year, но я не нашел любой четкий ответ на SOF. В конце дня мне нужно получить следующую ДФ:

     Share 
Year Gender Type   
1990 Women type_A 0.4166 
      type_B 0.5833 
    Men type_A 0.7500 
      type_B 0.2500 
1991 Women type_A 0.2500 
      type_B 0.7500 
    Men type_A 0.3750 
      type_B 0.6250 

Обычно, я хотел бы сделать это с помощью div функции, но это не похоже на работу здесь более одного индекса. Кто-то сталкивался с подобной ситуацией? Заранее спасибо !

ответ

1

Одним из вариантов было бы вычислить группу суммы по годам и полу, а затем разделить исходный кадр данных по сумме (результат немного отличается, потому что вы не установили семена для генератора случайных чисел):

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

enter image description here

+0

Спасибо, я люблю тебя. Что означает уровень [0,1]? Есть ли там, где вы определяете индекс для вычисления доли, как индекс 0, является Годом, а индекс 1 - гендерным? Кроме того, вы знаете, почему «df/df.groupby (level = [0, 1]). Sum() 'не работает? –

+0

'level' [0,1] означает уровень мультииндекса, поэтому ваш мультииндекс состоит всего из трех уровней, 0 и 1 представляют собой первые два уровня« год »и« пол »соответственно. 'df/df.groupby (level = [0, 1]). sum()' не работает, потому что 'groupby(). Синтаксис sum()' уменьшает кадр данных до меньшего размера, и, следовательно, размерность не совпадают с исходным фреймом данных, что приводит к сбою деления. С другой стороны, 'transform' сохраняет форму кадра данных, но производит агрегированные значения. – Psidom

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