获取 groupby 和 nlargest 之后的行索引

发布于 2025-01-09 06:44:32 字数 950 浏览 1 评论 0原文

我有一个大型数据框,我想使用 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())

它返回

   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 出现在此结果数据框中。我使用以下内容对原始数据帧进行子集化,但它返回一个空数据帧。我应该如何修改代码?

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

I have a large dataframe where I want to use groupby and nlargest to look for the second largest, third, fourth and fifth largest value of each group. I have over 500 groups and each group has over 1000 values. I also have other columns in the dataframe which I want to keep after applying groupby and nlargest. My dataframe looks like this

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]
})

To look for second, third, fourth largest and so on of each group for column a I use

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

which 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

I need columns b and c present in this resulting dataframe. I use the following to subset the original dataframe but it returns an empty dataframe. How should I modify the code?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

谎言 2025-01-16 06:44:32

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

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

If I understand your goal correctly, you should be able to just drop as_index=False, use idxmin instead of min, pass the result to df.loc:

df.loc[df.groupby('group')['a'].apply(lambda grp: grp.nlargest(2).idxmin())]
山田美奈子 2025-01-16 06:44:32

您可以使用 agg lambda。更整洁了

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

You can uses agg lambda. It is neater

df.groupby('group').agg(lambda grp: grp.nlargest(2).min())
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文