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

基于Pandas计算字典的加权平均值(高效向量化实现)

高效计算JSON字典列的加权平均值(向量化优先)

针对你DataFrame中存储为JSON字符串的字典列,以下是两种高效的向量化实现方案,优先保证性能和代码简洁性:

方法一:Numpy向量化元素处理(推荐)

这种方法直接对每行JSON字符串解析,利用Numpy的向量化运算计算加权平均,代码简洁且性能优异,适配数千行数据的场景:

  1. 导入依赖库
import pandas as pd
import json
import numpy as np
  1. 构造示例DataFrame(替换为你的实际数据)
df = pd.DataFrame({
    'data': [
        '{"100":10,"50":3,"-90":2}',
        '{"100":70,"50":3,"-90":2,"-40":3}'
    ]
})
  1. 定义加权平均计算函数
def compute_weighted_avg(json_str):
    weight_dict = json.loads(json_str)
    # 将字典键转为数值数组,值转为权重数组
    values = np.array(list(map(float, weight_dict.keys())))
    weights = np.array(list(weight_dict.values()))
    # 计算加权平均:(Σ(数值*权重)) / Σ权重
    return (values * weights).sum() / weights.sum()
  1. 应用函数到目标列
df['weighted_avg'] = df['data'].apply(compute_weighted_avg).round(3)

运行后,df['weighted_avg']会得到预期结果:[64.667, 87.824]。

方法二:Pandas堆叠分组计算

如果需要保留中间数据进行后续处理,可以采用json_normalize+stack的原生向量化组合:

  1. 解析JSON列并标准化为宽表
dict_series = df['data'].apply(json.loads)
normalized_df = pd.json_normalize(dict_series)
  1. 将宽表转为长表,提取数值和权重
stacked_df = normalized_df.stack().reset_index()
stacked_df.columns = ['row_index', 'value', 'weight']
# 转换数据类型确保计算精度
stacked_df['value'] = stacked_df['value'].astype(float)
stacked_df['weight'] = stacked_df['weight'].astype(float)
  1. 按行索引分组计算加权平均
result = stacked_df.groupby('row_index').apply(
    lambda g: (g['value'] * g['weight']).sum() / g['weight'].sum()
).round(3)
df['weighted_avg'] = result

性能提示

  • 两种方法均避免了纯Python循环,利用Numpy/Pandas的向量化引擎提升效率,处理数千行、每行数百键值对的场景毫无压力。
  • 方法一在代码简洁性和执行速度上更优,优先推荐使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:45:37