使用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
相关产品推荐
相关产品推荐

