如何在DataFrame中根据目标值获取对应无序列表的前后相邻数值?
实现逻辑
我们可以按以下步骤逐行处理数据:
- 对每行的
UNORDERED_LIST做升序排序 - 判断目标值
VALUE_TO_FIND是否在排序后的列表中:- 存在:前后相邻值都取目标值本身
- 不存在:找到目标值的插入位置,取插入位置的前一个元素为
PREVIOUS_VALUE,插入位置的当前元素为NEXT_VALUE
可直接运行的Python代码
import pandas as pd import bisect # 构造示例DataFrame df = pd.DataFrame({ 'VALUE_TO_FIND': [5, 3, 2, 5, 4], 'UNORDERED_LIST': [ [0, 10], [1, 0, 10, 8, 4, 2], [9, 10, 0], [4, 8, 0, 1, 2, 10], [0, 10, 4] ] }) def get_neighbors(row): target = row['VALUE_TO_FIND'] sorted_list = sorted(row['UNORDERED_LIST']) # 目标值存在的情况 if target in sorted_list: return pd.Series([target, target]) # 不存在的情况用二分法找插入位置 pos = bisect.bisect_left(sorted_list, target) prev = sorted_list[pos-1] next_val = sorted_list[pos] return pd.Series([prev, next_val]) # 新增两个结果字段 df[['PREVIOUS_VALUE', 'NEXT_VALUE']] = df.apply(get_neighbors, axis=1) print(df)
输出结果
运行上述代码得到的结果和预期完全一致:
| VALUE_TO_FIND | UNORDERED_LIST | PREVIOUS_VALUE | NEXT_VALUE |
|---|---|---|---|
| 5 | [0, 10] | 0 | 10 |
| 3 | [1, 0, 10, 8, 4, 2] | 2 | 4 |
| 2 | [9, 10, 0] | 0 | 9 |
| 5 | [4, 8, 0, 1, 2, 10] | 4 | 8 |
| 4 | [0, 10, 4] | 4 | 4 |
内容的提问来源于stack exchange,提问作者Ricardo Carrera
相关产品推荐
相关产品推荐

