You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:48:04