对groupby中的多索引执行函数

2024-04-20 14:00:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个多索引的数据帧。下面是一个最小的工作示例:

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执行groupby,其中notet是列,而不是索引:

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

但是我不希望在执行reset_index()之后再执行另一个set_index()来将数据帧恢复到多索引版本。我该怎么做?agg函数只适用于列,而不适用于索引。你知道吗


Tags: 数据示例dataframedf原始数据indexvalmin
2条回答

有可能,但不是很干净:

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

你可以直接在多重索引上工作。使用to_seriesdfs.index转换为一系列多索引和元组值。接下来,切片以获取元组值的最后一级。在那之后,只需对level=0agg像正则列那样执行groupby

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

相关问题 更多 >