Pandas DataFrame列值替换:将Lx列数值替换为steps列表中最接近的值
实现方案
直接借助numpy的定位和向量运算即可高效实现需求,核心逻辑是先定位每个Lx在有序steps中的相邻区间,再对比距离选择更近的边界值,完整可运行代码如下:
import pandas as pd import numpy as np if __name__ == "__main__": Dataex = [[0.6, 0.36], [0.6, 0.36], [0.9, 0.81], [0.8, 0.64], [1.0, 1.00], [1.0, 1.00], [0.9, 0.81], [1.2, 1.44], [1.0, 1.00], [1.0, 1.00], [1.2, 1.44], [1.1, 1.21]] Dataex = pd.DataFrame(data = Dataex, columns = ['Lx', 'A']) steps = [0, 0.75, 1, 1.25, 1.5, 1.75 ,2, 2.25, 2.4, 2.5, 2.75, 3, 3.25, 3.5, 3.75, 4, 4.25, 4.5, 4.75, 5, 5.25, 5.5, 5.75, 6] # 核心实现逻辑 steps_arr = np.array(steps) # 定位插入位置 idx = np.searchsorted(steps_arr, Dataex['Lx']) # 裁剪索引避免越界 idx = np.clip(idx, 1, len(steps_arr)-1) # 取左右两个边界值 left_bound = steps_arr[idx-1] right_bound = steps_arr[idx] # 对比距离选择更近的边界 Dataex['Lx_new'] = np.where(Dataex['Lx'] - left_bound < right_bound - Dataex['Lx'], left_bound, right_bound) # 输出结果 print(Dataex)
结果验证
运行上述代码后输出的DataFrame和你给出的期望结果完全一致:
Lx A Lx_new 0 0.6 0.36 0.75 1 0.6 0.36 0.75 2 0.9 0.81 1.00 3 0.8 0.64 0.75 4 1.0 1.00 1.00 5 1.0 1.00 1.00 6 0.9 0.81 1.00 7 1.2 1.44 1.25 8 1.0 1.00 1.00 9 1.0 1.00 1.00 10 1.2 1.44 1.25 11 1.1 1.21 1.00
逻辑说明
- 如果Lx本身就存在于steps中,那么
np.searchsorted返回的位置对应的左右边界其中一个就是Lx本身,差值为0,会直接保留原值,符合规则1 - 区间内的值会自动对比和左右边界的距离,返回更近的那个,符合规则2
- 若遇到Lx和两个边界距离完全相等的情况,上述代码会默认选择右边界,你可以根据需要调整
np.where的判断条件(比如改成小于等于就选左边界)
内容的提问来源于stack exchange,提问作者DaniV
相关产品推荐
相关产品推荐

