求问:如何将Excel邻近值平均计算逻辑迁移至Pandas
在Pandas中基于数值邻近性计算平均值的解决方案
需求说明
针对DataFrame的Column A数值列,为每个数值计算所有与它差值绝对值≤2的数值的平均值,结果存入Column B,对应Excel公式:=AVERAGE(IF(INDEX(ABS($A$1:$A$5-TRANSPOSE($A$1:$A$5)),,ROW(B1))<2,$A$1:$A$5))。
方法1:使用apply遍历(适合小数据集)
通过自定义函数结合apply逐行处理每个元素,逻辑直观易懂:
import pandas as pd # 构造示例数据 df = pd.DataFrame({'A': [1, 3, 5, 7, 9]}) def calc_nearby_avg(current_val, full_series, threshold=2): # 筛选出与当前值差值绝对值≤阈值的元素 valid_values = full_series[abs(full_series - current_val) <= threshold] return valid_values.mean() # 生成Column B df['B'] = df['A'].apply(calc_nearby_avg, full_series=df['A'])
方法2:广播矩阵计算(适合大数据集,效率更高)
利用NumPy广播特性生成差值矩阵,避免循环,大幅提升处理速度:
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({'A': [1, 3, 5, 7, 9]}) # 生成所有元素间的差值绝对值矩阵 diff_array = abs(df['A'].to_numpy()[:, np.newaxis] - df['A'].to_numpy()) # 创建布尔掩码,标记符合条件的元素位置 mask = diff_array <= 2 # 计算每行的平均值:有效元素求和 / 有效元素数量 df['B'] = (df['A'].to_numpy() * mask).sum(axis=1) / mask.sum(axis=1)
验证结果
示例数据运行后,Column B结果为:[2.0, 3.0, 5.0, 7.0, 8.0],与Excel公式计算结果完全一致。
内容的提问来源于stack exchange,提问作者Ryan Schultz
相关产品推荐
相关产品推荐

