2015-08-19 5 views
2

Моих Панды DataFrame, df, выглядит следующим образом:Панда: индекс максимального значения для каждой группы

parameter1 parameter2 value 

1   1   0.1 
      2   0.2 

2   1   0.6 
      2   0.3 

value является результатом groupby(['parameter1','parameter2']).mean() на другие DataFrame. Теперь я могу найти максимальное значение value для каждого значения parameter1 с помощью

df.max(level='parameter1') 

Однако, мне нужно найти соответствующее значение parameter2 для этого максимального значения. Кажется df.idxmax() не поддерживает level=, так как я могу это сделать вместо этого?

ответ

1

В конце концов я нашел трюк:

GroupBy на уровне 0() и параметра 1 применяются idxmax() и получить значения:

v = df.groupby(level=0).idxmax().values 
v 
array([[(1, 2)], 
     [(2, 1)]], dtype=object) 

Это то, что df.idxmax(level=0) бы дать, если выполнены.

Таким образом, v содержит индекс, указывающий максимальное значение для этого уровня. Таким образом, вы можете получить реальные значения с:

df.loc[v.ravel()] 

         value 
parameter1 parameter2  
1   2    0.2 
2   1    0.6 

и, наконец, получить значение PARAMETER2 соответствующее макс значений:

df.loc[v.ravel()].index.values[1] 
(2, 1) 

НТН

2

Хороший способ будет

df.unstack().idxmax(axis=1) 

Устранение фрейма данных дает блок данных с parameter_1 в качестве индекса столбца ,

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