Pandas DataFrame 按规则动态替换范围值及最近邻数值的实现方案
实现思路与代码
你可以按列处理,先完成小于15的值替换为1的逻辑,再计算未替换值和1的数值差,取差值最小的位置替换为2即可,代码如下:
import pandas as pd import numpy as np # 原始DataFrame df = pd.DataFrame(data={'a':[1,1,13,23,40], 'b': [89.87,1,12,4,8], 'c': [45,12,901,12,29]}).astype(float) def handle_column(col): # 第一步:标记所有小于15的位置 lt15_mask = col < 15 # 替换小于15的值为1 col = col.mask(lt15_mask, 1) # 第二步:筛选未被替换为1的位置 other_mask = ~lt15_mask if not other_mask.any(): # 所有值都小于15直接返回 return col # 计算未替换值和1的数值差绝对值 diff = np.abs(col[other_mask] - 1) # 取差值最小的位置 min_diff_pos = diff[diff == diff.min()].index # 替换为2 col.loc[min_diff_pos] = 2 return col # 对每一列应用处理逻辑 result = df.apply(handle_column)
运行后result和你给出的期望结果完全一致。
如果你的实际需求是索引位置距离而非数值距离,只需要把handle_column函数中的差值计算部分替换为索引距离计算即可:
# 替换差值计算部分代码 idx = np.arange(len(col)) lt15_idx = idx[lt15_mask] other_idx = idx[other_mask] # 计算索引距离的最小值 min_dist = np.abs(other_idx[:, None] - lt15_idx).min(axis=1) min_dist_pos = other_idx[min_dist == min_dist.min()] col.iloc[min_dist_pos] = 2
内容的提问来源于stack exchange,提问作者an10b3
相关产品推荐
相关产品推荐

