在 groupby 中对多索引执行功能

我有一个带有 MultiIndex 的数据框。这是一个最小的工作示例:


df = pd.DataFrame({'note':[1,1,1,2,2,2,2],'t': [0.5,0.7,1.2,0.3,0.9,1.3,1.7],'val':[1,-1,0,0,1,0,0]})

dfs = df.set_index(['note','t'])

这使


>>> dfs

          val

note t

1    0.5    1

     0.7   -1

     1.2    0

2    0.3    0

     0.9    1

     1.3    0

     1.7    0

我想要的是获得(a)最小值和(b)t每组索引中的第一个值:


note min  first

1    0.5  0.5

2    0.3  0.3

我可以对原始数据框进行分组df,其中note和t是列而不是索引:


df.groupby('note').agg({'t': [min, lambda x: list(x)[0]]})

但我宁愿不执行reset_index()另一个set_index()将数据帧恢复到 MultiIndex 版本的操作。我该怎么做呢?该agg函数仅适用于列,而不适用于索引。


一只名叫tom的猫
浏览 157回答 2
2回答

开满天机

这是可能的,但不是很干净:df = (dfs.index.get_level_values(1).to_series()         .groupby(dfs.index.get_level_values(0))         .agg(['min', 'first']))print (df)      min  firstnote            1     0.5    0.52     0.3    0.3df = dfs.reset_index('t').groupby(level=0)['t'].agg(['min', 'first'])print (df)      min  firstnote            1     0.5    0.52     0.3    0.3

杨魅力

您可以直接在多索引上工作。用于to_series转换dfs.index为一系列多索引和元组值。接下来,切片以获取元组值的最后一个元素。之后就做groupby和level=0喜欢agg常规专栏dfs.index.to_series().str[-1].groupby(level=0).agg(['min', 'first'])Out[463]:      min  firstnote1     0.5    0.52     0.3    0.3
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python