为了账号安全,请及时绑定邮箱和手机立即绑定

在 groupby 中对多索引执行功能

在 groupby 中对多索引执行功能

一只名叫tom的猫 2022-04-27 16:08:30
我有一个带有 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          valnote t1    0.5    1     0.7   -1     1.2    02    0.3    0     0.9    1     1.3    0     1.7    0我想要的是获得(a)最小值和(b)t每组索引中的第一个值:note min  first1    0.5  0.52    0.3  0.3我可以对原始数据框进行分组df,其中note和t是列而不是索引:df.groupby('note').agg({'t': [min, lambda x: list(x)[0]]})但我宁愿不执行reset_index()另一个set_index()将数据帧恢复到 MultiIndex 版本的操作。我该怎么做呢?该agg函数仅适用于列,而不适用于索引。
查看完整描述

2 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

这是可能的,但不是很干净:


df = (dfs.index.get_level_values(1).to_series()

         .groupby(dfs.index.get_level_values(0))

         .agg(['min', 'first']))

print (df)

      min  first

note            

1     0.5    0.5

2     0.3    0.3

df = dfs.reset_index('t').groupby(level=0)['t'].agg(['min', 'first'])

print (df)

      min  first

note            

1     0.5    0.5

2     0.3    0.3


查看完整回答
反对 回复 2022-04-27
?
杨魅力

TA贡献1811条经验 获得超6个赞

您可以直接在多索引上工作。用于to_series转换dfs.index为一系列多索引和元组值。接下来,切片以获取元组值的最后一个元素。之后就做groupby和level=0喜欢agg常规专栏


dfs.index.to_series().str[-1].groupby(level=0).agg(['min', 'first'])


Out[463]:

      min  first

note

1     0.5    0.5

2     0.3    0.3


查看完整回答
反对 回复 2022-04-27
  • 2 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信