pandas 数据框中 groupby.agg 的 N 最大/idxmax

N largest / idxmax of a groupby.agg in a pandas data frame

我想查找的不是单个最大索引,而是 pandas groupby.agg 操作的 n 个最大索引。

我的数据框是这样的:

>>> dat = [{"date": datetime.date(2021,1,1), "category": "cats", "var": 1},
       {"date": datetime.date(2021,1,1), "category": "dogs", "var": 0},
       {"date": datetime.date(2021,2,1), "category": "cats", "var": -1},
       {"date": datetime.date(2021,2,1), "category": "dogs", "var": 3},
       ]
>>> df = pd.DataFrame(dat)

>>> df.groupby(["date", "category"]).agg({'var': ['sum']})
                    var
                    sum
date       category    
2021-01-01 cats       1
           dogs       0
2021-02-01 cats      -1
           dogs       3

获取var值最大的索引:

>>> df.groupby(["date", "category"]).agg({'var': ['sum']}).idxmax()

var  sum    (2021-02-01, dogs)
dtype: object

确认,没错。我可以看到索引 (2021-02-01, dogs),其中 var 的值为最大值。

所以现在,我不仅希望看到最大的索引,而且还希望看到 n 大的索引。这里,n=2.

然而,这个问题的明显解决方案 nlargest(2, variable_name) 似乎失败了:

df.groupby(["date", "category"]).agg({'var': ['sum']}).nlargest(2, 'sum')

失败,似乎是多索引失败:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()
KeyError: 'sum'

如何获得 n 个最大索引的 idxmax?我假设有一个可以传递给 nlargestlevel 的多索引,但我没有看到它。

怎么样:

(df.groupby(['date','category'])['var'].sum()
   .nlargest(2).index
)

输出:

MultiIndex([('2021-1-1', 'dogs'),
            ('2021-1-1', 'cats')],
           names=['date', 'category'])

按照你的例子:

x = (
    df.groupby(["date", "category"])
    .agg({"var": ["sum"]})
    .nlargest(2, ("var", "sum"))
    .index
)
print(x)

打印:

MultiIndex([(2021-02-01, 'dogs'),
            (2021-01-01, 'cats')],
           names=['date', 'category'])

但你也可以这样做:

x = (
    df.groupby(["date", "category"])
    .agg({"var": "sum"})             # <--- omit the [ ]
    .nlargest(2, "var")
    .index
)
print(x)

打印:

MultiIndex([(2021-02-01, 'dogs'),
            (2021-01-01, 'cats')],
           names=['date', 'category'])