获取 groupby 和 nlargest 之后的行索引

Get index of rows after groupby and nlargest

我有一个大数据框,我想在其中使用 groupbynlargest 来查找每个组的第二大、第三、第四和第五大值。我有 500 多个组,每个组都有 1000 多个值。在应用 groupbynlargest 之后,我还想在数据框中保留其他列。我的数据框看起来像这样

df = pd.DataFrame({
    'group': [1,2,3,3,4, 5,6,7,7,8],
    'a': [4, 5, 3, 1, 2, 20, 10, 40, 50, 30],
    'b': [20, 10, 40, 50, 30, 4, 5, 3, 1, 2],
    'c': [25, 20, 5, 15, 10, 25, 20, 5, 15, 10]
})

要为列 a 查找每个组的第二、第三、第四大等等,我使用

secondlargest = df.groupby(['group'], as_index=False)['a'].apply(lambda grp: grp.nlargest(2).min())

哪个returns

   group   a
0      1   4
1      2   5
2      3   1
3      4   2
4      5  20
5      6  10
6      7  40
7      8  30

我需要在此生成的数据框中显示列 bc。我使用以下内容对原始数据框进行子集化,但它 returns 是一个空数据框。我该如何修改代码?

secondsubset = df[df.groupby(['group'])['a'].apply(lambda grp: grp.nlargest(2).min())]

如果我正确理解你的目标,你应该可以直接删除 as_index=False,使用 idxmin 而不是 min,将结果传递给 df.loc

df.loc[df.groupby('group')['a'].apply(lambda grp: grp.nlargest(2).idxmin())]

您可以使用 agg lambda。更整洁

df.groupby('group').agg(lambda grp: grp.nlargest(2).min())