我有一个带有 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
杨魅力
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
添加回答
举报
0/150
提交
取消