如何按最小间隔对未排序时间序列数据分箱?附Pandas实例
解决未排序序列按最小间隔分箱的问题
我来帮你搞定这个需求!你要的是从未排序的数值序列里挑选出满足「选中元素间最小差值至少为0.0005」的项,并用1标记选中项、0标记未选中项。下面是具体的实现思路和代码:
核心思路
咱们用贪心算法来处理这个问题,配合Pandas的索引操作保证结果和原数据顺序一致:
- 先对数据排序,但保留每个元素的原始索引——这样后续能把选中标记映射回原DataFrame的位置。
- 从排序后的第一个元素开始标记为选中(1),然后跳过所有小于等于「当前选中元素+0.0005」的元素,直到找到下一个符合间隔要求的元素,重复这个过程。
- 最后把标记结果按原始索引还原,得到目标的
output列。
完整代码
import pandas as pd # 你的原始DataFrame x = pd.DataFrame({'a':[1.1341, 1.13421, 1.13433, 1.13412, 1.13435, 1.13447, 1.13459, 1.13452, 1.13471, 1.1348, 1.13496,1.13474,1.13483,1.1349,1.13502,1.13515,1.13526,1.13512]}) # 1. 排序并保留原始索引 sorted_df = x['a'].sort_values().reset_index() # 2. 初始化标记数组,默认全为0 output_marks = [0] * len(sorted_df) # 第一个元素直接选中 output_marks[0] = 1 last_selected_val = sorted_df['a'].iloc[0] min_interval = 0.0005 # 遍历排序后的元素,贪心选择符合间隔要求的项 for idx in range(1, len(sorted_df)): current_val = sorted_df['a'].iloc[idx] # 检查当前元素和上一个选中元素的间隔是否达标 if current_val > last_selected_val + min_interval: output_marks[idx] = 1 last_selected_val = current_val # 3. 将标记结果映射回原DataFrame的顺序 x['output'] = pd.Series(output_marks, index=sorted_df['index']).sort_index().values # 查看结果 print(x)
代码解释
- 第一步的
sorted_df不仅对a列做了排序,还通过reset_index()保留了每个元素在原DataFrame中的位置,这是保证结果顺序正确的关键。 - 贪心遍历的逻辑很直接:每次只选第一个满足间隔要求的元素,完全适配你的标记需求。
- 最后一步通过
pd.Series把标记结果按原始索引对齐,再排序后赋值给x['output'],就能得到你想要的[1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0]这个结果。
内容的提问来源于stack exchange,提问作者Vinay
相关产品推荐
相关产品推荐

