如何基于非均匀索引子集对Pandas DataFrame按区间取最大值重采样
按自定义左开右闭索引区间对DataFrame取最大值
问题场景
给定Pandas DataFrame和一组索引分界点selected_indexes,需要按左开右闭规则(即区间(a, b]保留终点b、排除起点a)划分索引区间,对每个区间内的col列取最大值,最终结果以区间终点作为索引。
示例数据
import pandas as pd # 构造示例DataFrame df = pd.DataFrame({'col': [5, 0, 3, 3, 7, 9, 3, 5, 2, 4]}, index=range(10)) # 自定义索引分界点 selected_indexes = [0, 5, 6, 9]
解决方案
通过pd.cut将原索引映射到对应的区间标签(区间右端点),再分组取最大值即可实现需求:
# 构造区间边界:在分界点前添加负无穷,覆盖第一个分界点之前的索引 bins = [-float('inf')] + selected_indexes # 用分界点作为每个区间的标签(即结果的索引) labels = selected_indexes # 为每个索引分配对应的区间标签 df['group'] = pd.cut(df.index, bins=bins, labels=labels, right=True) # 按标签分组取最大值,整理结果格式 result = df.groupby('group')['col'].max().rename_axis(index=None).to_frame()
结果验证
运行上述代码后,result的输出与示例完全一致:
col 0 5 5 9 6 3 9 5
代码说明
pd.cut(..., right=True):指定区间为左开右闭,完美匹配需求中的规则;bins = [-float('inf')] + selected_indexes:确保第一个分界点0之前的索引(仅索引0)被分到第一个区间(-inf, 0];groupby('group').max():按区间标签分组后取最大值,最终通过rename_axis去掉分组索引的名称,保证结果格式符合预期。
内容的提问来源于stack exchange,提问作者Jeremy Cochoy
相关产品推荐
相关产品推荐

