多索引DataFrame中的pandas-Max值

时间:2019-10-15 05:40:21

标签: python pandas dataframe pandas-groupby multi-index

我有一个多索引数据框,如下所示。

+-------+----+------+
|       |    | %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   |
+-------+----+------+


我尝试过here的答案

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

但是我得到了显示整个数据帧的输出

1 个答案:

答案 0 :(得分:3)

对于我来说,工作更简单的解决方案-应该省略reset_indexisin并添加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

详细信息

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

编辑:

对于MultiIndex的前N个,可以将DataFrame.sort_valuesGroupBy.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