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

使用Pandas计算分组内每个值的最小距离差值

问题描述

假设存在如下DataFrame df:

group value
a       1
a       0
a       3
b       1
b       4

需要为每个值找到同一分组('a'或'b')中最接近的值,并输出该值与最接近值的差值,期望输出如下:

group value min_diff
a       1    1
a       0    1
a       3    2
b       1    3
b       4    3
解决方案

方法一:基于排序与相邻差值计算

先对每组内的值排序,通过相邻元素差值推导每个值的最小差值,最后匹配回原数据顺序:

import pandas as pd

# 构造示例DataFrame
df = pd.DataFrame({
    'group': ['a', 'a', 'a', 'b', 'b'],
    'value': [1, 0, 3, 1, 4]
})

def get_min_diff(group):
    sorted_vals = group.sort_values().reset_index(drop=True)
    # 计算排序后相邻元素的差值
    diffs = sorted_vals.diff().dropna()
    min_diffs = []
    for idx, val in enumerate(sorted_vals):
        if idx == 0:
            min_diffs.append(diffs.iloc[0])
        elif idx == len(sorted_vals)-1:
            min_diffs.append(diffs.iloc[-1])
        else:
            min_diffs.append(min(diffs.iloc[idx], diffs.iloc[idx-1]))
    temp = pd.DataFrame({'value': sorted_vals, 'min_diff': min_diffs})
    return group.merge(temp, on='value', how='left')

# 分组处理并输出结果
result = df.groupby('group', group_keys=False).apply(get_min_diff)
print(result)

方法二:基于numpy广播的全差值计算

通过numpy广播生成组内所有值的两两差值,排除自身比较后取最小值,逻辑更直接:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'group': ['a', 'a', 'a', 'b', 'b'],
    'value': [1, 0, 3, 1, 4]
})

def min_diff(group):
    vals = group['value'].values
    # 生成所有两两组合的差值绝对值
    diffs = np.abs(vals[:, None] - vals)
    # 将自身与自身的差值设为无穷大,避免被选中
    np.fill_diagonal(diffs, np.inf)
    # 取每行的最小值作为当前值的最小差值
    group['min_diff'] = diffs.min(axis=1)
    return group

result = df.groupby('group').apply(min_diff)
print(result)

两种方法运行后均可得到符合期望的输出结果。

内容的提问来源于stack exchange,提问作者Wendy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:24:55