Python 按多索引级别0(系列/数据帧)对列进行排序并筛选顶级结果

Python 按多索引级别0(系列/数据帧)对列进行排序并筛选顶级结果,python,pandas,Python,Pandas,我想将索引中每个元素的顶级结果分组到0级。例如,对于此数据帧/系列: import pandas as pd import numpy as np np.random.seed(1) index = list(zip(['A']*5 + ['B']*5, list(range(10)))) df = pd.Series(np.random.random((10)), index=pd.MultiIndex.from_tuples(index, names=['i0

我想将索引中每个元素的顶级结果分组到0级。例如,对于此数据帧/系列:

import pandas as pd
import numpy as np
np.random.seed(1)

index = list(zip(['A']*5 + ['B']*5, list(range(10))))
df = pd.Series(np.random.random((10)),
               index=pd.MultiIndex.from_tuples(index, names=['i0', 'i1']),
               name='val')

pd.DataFrame(df)


我想对
A
B
进行分组,并从每个组返回前3个
val
(降序)。

也许这就是您要找的

df.groupby(level=0, group_keys=False).apply(lambda x: x.sort_values(ascending=False).head(3))

i0  i1
A   1     0.720324
    0     0.417022
    3     0.302333
B   9     0.538817
    8     0.396767
    7     0.345561

这里还有一个类似的选项:

(df.sort_values('val', ascending=False).groupby(level=0).head(3)
   .sort_index(level = 0, sort_remaining=False, kind="mergesort"))

您不需要浪费时间进行排序,请使用
nlargest

df.groupby(level=0, group_keys=False).nlargest(3)

i0  i1
A   1     0.720324
    0     0.417022
    3     0.302333
B   9     0.538817
    8     0.396767
    7     0.345561
Name: val, dtype: float64