首页 > 解决方案 > 如何在熊猫中聚合每组的两个最大值?

问题描述

我正在浏览这个链接:Return top N maximum values per group using pandas

并找到了多种方法来查找每组的 topN 值。

但是,我更喜欢带有 agg 函数的字典方法,并且想知道是否可以获得与以下问题的字典方法等效的方法?

import numpy as np
import pandas as pd

df = pd.DataFrame({'A': [1,   1,   1,   2,   2],
                   'B': [1,   1,   2,   2,   1],
                   'C': [10,  20,  30,  40,  50],
                   'D': ['X', 'Y', 'X', 'Y', 'Y']})
print(df)
   A  B   C  D
0  1  1  10  X
1  1  1  20  Y
2  1  2  30  X
3  2  2  40  Y
4  2  1  50  Y

我可以做这个:

df1 = df.groupby(['A'])['C'].nlargest(2).droplevel(-1).reset_index()
print(df1)
   A   C
0  1  30
1  1  20
2  2  50
3  2  40

# also this
df1 = df.sort_values('C', ascending=False).groupby('A', sort=False).head(2)
print(df1)

# also this
df.set_index('C').groupby('A')['B'].nlargest(2).reset_index()

必需的

df.groupby('A',as_index=False).agg(
    {'C': lambda ser: ser.nlargest(2)  # something like this
    })

可以在这里使用字典吗?

标签: pythonpandas

解决方案


如果你想从 C 中获取像 A: 2 top values这样的字典,你可以运行:

df.groupby(['A'])['C'].apply(lambda x:
    x.nlargest(2).tolist()).to_dict()

对于您的 DataFrame,结果是:

{1: [30, 20], 2: [50, 40]}

推荐阅读