我有一个多索引数据框,如下所示。
+-------+----+------+
| | | %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]
但是我得到了显示整个数据帧的输出
答案 0 :(得分:3)
对于我来说,工作更简单的解决方案-应该省略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
详细信息:
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_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