pandas-Max значения из мультииндексного DataFrame - PullRequest
2 голосов
/ 15 октября 2019

У меня есть многоиндексный фрейм данных, как показано ниже.

+-------+----+------+
|       |    | %age |
+-------+----+------+
| Group | Id |      |
| 0     | 18 | 75   |
| 0     | 30 | 12   |
| 0     | 42 | 13   |
| 1     | 18 | 12   |
| 1     | 30 | 75   |
| 1     | 42 | 13   |
| 2     | 18 | 13   |
| 2     | 30 | 12   |
| 2     | 42 | 75   |
+-------+----+------+

Я хочу получить максимальные значения для каждой группы, но в отличие от многих других вопросов по SO , я также хочу показать все столбцы уровня индекса. как это:

+-------+----+------+
|       |    | %age |
| Group | Id |      |
| 0     | 18 | 75   |
| 1     | 30 | 75   |
| 2     | 42 | 75   |
+-------+----+------+


Я попробовал этот ответ из здесь

df1 = df_pct.reset_index(level=1, drop=True)
mask = df1.index.isin(df1.groupby(level=[0])['%age'].idxmax())
df_pct[mask]

Но я получаю вывод, который отображает весь фрейм данных

1 Ответ

3 голосов
/ 15 октября 2019

Для меня работает более простое решение - reset_index и isin следует опустить и добавить loc для выбора по MultiIndex значениям:

df = df_pct.loc[df_pct.groupby(level=[0])['%age'].idxmax()]
print (df)
          %age
Group Id      
0     18    75
1     30    75
2     42    75

Detail :

print (df_pct.groupby(level=[0])['%age'].idxmax())
Group
0    (0, 18)
1    (1, 30)
2    (2, 42)
Name: %age, dtype: object

РЕДАКТИРОВАТЬ:

Для верхней N с MultiIndex возможно использование DataFrame.sort_values с GroupBy.head:

N = 2
df1 = (df_pct.sort_values(['Group','%age'], ascending=[True, False])
             .groupby(level=[0])['%age']
             .head(N))

print (df1)
Group  Id
0      18    75
       42    13
1      30    75
       42    13
2      42    75
       18    13
Name: %age, dtype: int64
...