如何在Pandas中计算各列单元格间的最小绝对差值
计算DataFrame各列非自身元素间的最小绝对差值
给定示例DataFrame:
import pandas as pd df = pd.DataFrame({"A": [9, 6, 9, 4, 5], "B": [8, 2, 9, 7, 3], "C": [0, 9, 3, 15, 5],})
需求:返回一个和原DataFrame列名一致的单行DataFrame,每个列的值为该列所有非自身配对的单元格间绝对差值的最小值。预期结果如下:
df_result = pd.DataFrame( { "A": [0], # 两个9的差值 "B": [1], # 2&3、8&9、7&8的差值都是1 "C": [2], # 3&5的差值 } )
需要实现通用方法,可处理任意结构的DataFrame。
高效实现思路
直接计算所有两两元素的差值会产生O(n²)的运算量,更高效的方案是:
- 对每一列的元素排序
- 计算排序后相邻元素的绝对差
- 取这些差值的最小值(排序后最小的差值必然出现在相邻元素中)
该方法时间复杂度为O(n log n),远优于全量两两计算。
通用代码实现
def min_abs_diff_per_column(df): # 对每一列执行排序、计算相邻差、取最小值的操作 min_diffs = df.apply(lambda col: col.sort_values().diff().abs().min()) # 转换为单行DataFrame返回 return pd.DataFrame([min_diffs.values], columns=min_diffs.index)
测试验证
用示例DataFrame测试:
result = min_abs_diff_per_column(df) print(result)
输出结果:
A B C 0 0 1 2
完全符合预期。
特殊情况说明
- 若某列仅含1个元素:无法形成非自身配对,返回
NaN - 若某列存在重复元素:最小差值直接为0(如示例中的A列)
内容的提问来源于stack exchange,提问作者Scott Riggs
相关产品推荐
相关产品推荐

