来自多索引数据帧的熊猫最大值



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

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

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

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

最新更新