2016-09-01 3 views
2

Цель: Я пытаюсь разделить каждую строку в многоуровневом индексе на общее число в каждой группе.Pandas - Multiindex Division [т. Division by Group]

Более конкретно: Учитывая следующие данные, я хочу, чтобы разделить количество красных и синих шариков от общего числа в каждой группе (т.е. сумма по дате, стране и цвет)

      Number 
Date Country Colour  
2011 US  Red  4 
       Blue  6 
2012 IN  Red  9 
     IE  Red  5 
       Blue  5 
2013 JP  Red  15 
       Blue  25 

Это дало бы следующий ответ:

      Number 
Date Country Colour  
2011 US  Red  0.4 
       Blue  0.6 
2012 IN  Red  1.0 
     IE  Red  0.5 
       Blue  0.5 
2013 JP  Red  0.375 
       Blue  0.625 

Вот код, чтобы воспроизвести данные:

arrays = [np.array(['2011', '2011', '2012', '2012', '2012', '2013', '2013']), 
np.array(['US', 'US', 'IN', 'IE', 'IE', 'JP', 'JP', 'GB']), 
np.array(['Red', 'Blue', 'Red', 'Red', 'Blue', 'Red', 'Blue', 'Blue'])] 

df = pd.DataFrame(np.random.rand(7, 1)*10, index=arrays, columns=['number']) 
df.index.names = ['Date', 'Country', 'Colour'] 

ответ

3

Более короткая версия будет:

df.groupby(level=['Date', 'Country']).transform(lambda x: x/x.sum()) 

        number 
Date Country Colour   
2011 US  Red  0.400 
      Blue  0.600 
2012 IN  Red  1.000 
    IE  Red  0.500 
      Blue  0.500 
2013 JP  Red  0.375 
      Blue  0.625 
+1

Это идеальный вариант - именно ответ, который я искал! Спасибо! –

+0

Определенно лучше. – ayhan

+0

@ayhan, Большое спасибо :-) –