2015-06-18 2 views
0

У меня есть следующие dataframe (панды версия 0.13.1)получать все соответствующие максимальные значения в пандами сводной таблице

>>> import pandas as pd 
>>> DF = pd.DataFrame({'Group':['G1','G1','G2','G2'],'Start':['10','10','12','13'],'End':['13','13','14','15'],'Sample':['S1','S2','S3','S3'],'Status':['yes','yes','no','yes'],'pValue':[0.13,0.12,0.96,0.76],'pValueString':['13/100','12/100','96/100','76/100'],'desc':['aaaaaa','bbbbbb','aaaaaa','cccccc']}) 
>>> DF 
    End Group Sample Start Status pValue pValueString desc 
0 13 G1  S1 10 yes 0.13  13/100 aaaaaa 
1 13 G1  S2 10  no 0.12  12/100 bbbbbb 
2 14 G2  S3 12  no 0.96  96/100 aaaaaa 
3 15 G2  S3 13 yes 0.76  76/100 cccccc 

[4 строки х 8 столбцов]

К dataframe выше

  1. Я хотел бы groupby 'Group'.
  2. Затем группа с куратором начала.
  3. Поверните значения выборки для каждой группы. aggregate by max (pValue)
  4. Получите соответствующее состояние, desc, соответствующее образцу с более высоким значением pvalue, и замените его значением на pValueString.

Мне нужно в конечном итоге получить это в следующем формате

Group Start End Sample   Status desc 
        S1 S2 
G1 10 13 13/100 12/100 yes  aaaaaa 
        S3 
G2 12 14 96/100   no  aaaaaa 
     13 15 76/100   yes  cccccc 

Я попытался использовать pivot_table и GroupBy, но безрезультатно. Любая помощь будет высоко оценена.

Я

grouped=DF.groupby('Group') 
for g,v in grouped: 
    pandas.pivot_table(data=v,values=['pValue','pValueString']),rows= ['Group','Start','End'],cols=['Sample'])['pValueString'] 

Как получить соответствующий DESC и статус?

ответ

1

Сначала найдите свои значения по алфавиту и Статус:

groups = DF.groupby(['Group','Start','End']) 
maxvals = groups.apply(lambda x: x.sort('pValue', ascending = False).head(1)) 
maxvals = maxvals[['Status','desc']].reset_index()  
maxvals 
Out[69]: 
    Group Start End level_3 Status desc 
0 G1 10 13  0 yes aaaaaa 
1 G2 12 14  2  no aaaaaa 
2 G2 13 15  3 yes cccccc 

Создание сводной таблицы отдельно:

pvt = DF.pivot_table(index =['Group','Start','End'], 
        columns = 'Sample', 
        values = 'pValueString', 
        aggfunc = max).reset_index() 
pvt 

Out[70]: 
Sample    S1  S2  S3 
Group Start End       
G1 10 13 13/100 12/100  NaN 
G2 12 14  NaN  NaN 96/100 
     13 15  NaN  NaN 76/100 

Наконец объединить два вместе

pd.merge(pvt, maxvals) 
Out[73]: 
Sample Group Start End  S1  S2  S3 level_3 Status desc 
0   G1 10 13 13/100 12/100  NaN  0 yes aaaaaa 
1   G2 12 14  NaN  NaN 96/100  2  no aaaaaa 
2   G2 13 15  NaN  NaN 76/100  3 yes cccccc 
+0

Просто интересно, можно ли напечатать столбец «уровень». Также можно было бы отсортировать каждое значение группы с помощью соответствующих значений Sample? – user2755526

0

Создать индекс групп с наивысшими значениями pValues ​​(для каждого образца для заданного начала и конца внутри группы):

idx = DF.groupby(['Group', 'Start', 'End']).pValue.agg(lambda x: x.idxmax()) 

Используйте этот индекс, чтобы получить статус и DESC:

a = DF.ix[idx][['Status', 'desc']] 
>>> a 
    Status desc 
0 yes aaaaaa 
2  no aaaaaa 
3 yes cccccc 

Затем получить максимальное p-значение для каждой группы/образец (в сводной форме таблицы).

b = DF.groupby(['Group', 'Start', 'End', 'Sample']).pValue.max().unstack() 
>>> b 
Sample    S1 S2 S3 
Group Start End     
G1 10 13 0.13 0.12 NaN 
G2 12 14 NaN NaN 0.96 
     13 15 NaN NaN 0.76 

Наконец, установите индекс предыдущего DataFrame в индекс нового и соединитесь.

a.index = b.index 
df_new = b.join(a) 
>>> df_new 
        S1 S2 S3 Status desc 
Group Start End         
G1 10 13 0.13 0.12 NaN yes aaaaaa 
G2 12 14 NaN NaN 0.96  no aaaaaa 
     13 15 NaN NaN 0.76 yes cccccc 
Смежные вопросы