多索引DataFrame跨并行层级的自定义聚合实现需求
问题:折叠多层索引DataFrame并按指定层级聚合最小值
我有一个采用层级结构组织的DataFrame,示例如下:
baseval indexlevel0 indexlevel1 indexlevel2 L0-0 L1-0 L2-0 1 L2-1 1 L2-2 20 L1-1 L2-0 2 L2-1 2 L2-2 10
我需要创建一个新的DataFrame,折叠中间层级indexlevel1,将对应indexlevel2的取值替换为原indexlevel1下该层级的baseval最小值。期望结果如下:
minbylevel indexlevel0 indexlevel2 L0-0 L2-0 1 L2-1 1 L2-2 10
我完全不知道该从何入手,现有的聚合示例都是自底向上执行的。
以下是用于创建初始DataFrame的测试代码:
import pandas as pd from io import StringIO testdata = """ indexlevel0,indexlevel1,indexlevel2,baseval L0-0,L1-0,L2-0,1 L0-0,L1-0,L2-1,1 L0-0,L1-0,L2-2,20 L0-0,L1-1,L2-0,2 L0-0,L1-1,L2-1,2 L0-0,L1-1,L2-2,10 """ testinput = StringIO(testdata) data_df = pd.read_csv(testinput, index_col=[0,1,2], header=[0]).sort_index() print(data_df)
解决方案
直接使用groupby指定需要保留的索引层级,然后对目标列取最小值即可:
# 按指定索引层级分组,计算baseval的最小值并重命名列 result_df = data_df.groupby(level=['indexlevel0', 'indexlevel2'])['baseval'].min().rename('minbylevel') print(result_df)
代码说明
groupby(level=['indexlevel0', 'indexlevel2']):明确指定按这两个索引层级分组,自动忽略中间的indexlevel1层级['baseval'].min():对分组后的baseval列计算最小值.rename('minbylevel'):将结果列重命名为预期的列名
执行后输出结果与需求完全匹配:
minbylevel indexlevel0 indexlevel2 L0-0 L2-0 1 L2-1 1 L2-2 10
内容的提问来源于stack exchange,提问作者user1848244
相关产品推荐
相关产品推荐

