2015-12-01 2 views
0

У меня есть следующий CSV данные:Как нормализовать мультииндексное DataFrame с суммой значений

id,gene,celltype,stem,stem,stem,bcell,bcell,tcell 
id,gene,organs,bm,bm,fl,pt,pt,bm 
134,foo,about_foo,20,10,11,23,22,79 
222,bar,about_bar,17,13,55,12,13,88 

И я могу успешно обобщать их таким образом:

import pandas as pd 
df = pd.read_csv("http://dpaste.com/1X74TNP.txt",header=None,index_col=[1,2]).iloc[:, 1:] 

df.columns = pd.MultiIndex.from_arrays(df.ix[:2].values) 
df = df.ix[2:].astype(int) 
df.index.names = ['cell', 'organ'] 
df = df.reset_index('organ', drop=True) 

result = df.groupby(level=[0, 1], axis=1).mean() 
result = result.stack().replace(np.nan, 0).unstack() 
result = result.swaplevel(0,1, axis=1).sort_index(axis=1) 

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

In [341]: result 
Out[341]: 
     bm    fl    pt 
    bcell stem tcell bcell stem tcell bcell stem tcell 
cell 
foo  0 15 79  0 11  0 22.5 0  0 
bar  0 15 88  0 55  0 12.5 0  0 

Теперь для каждого 'bm' 'fl' и 'pt'. Я суммировать значения в результате этого:

In [352]: result.sum(level=[0],axis=1) 
Out[352]: 
     bm fl pt 
cell 
foo 94 11 22.5 
bar 103 55 12.5 

То, что я хочу сделать, это разделить раздел result с его соответствующим sum уступая в этом:

   bm        fl    pt 
      bcell stem   tcell   bcell stem tcell bcell stem tcell 
    cell 
    foo  0 15/94 (0.159) 79/94 (0.83)  0 11/11  0 22.5/22.5 0  0 
    bar  0 15/103   88/103   0 55/55  0 12.5/12.5 0  0 

Как я могу добиться этого?

ответ

1

Вы можете

sum = result.sum(level=0, axis=1) 

print(result.div(sum, axis=1, level=0)) 

получить

 bm      fl    pt   
    bcell  stem  tcell bcell stem tcell bcell stem tcell 
cell                
foo  0 0.159574 0.840426  0 1  0  1 0  0 
bar  0 0.145631 0.854369  0 1  0  1 0  0 
Смежные вопросы