基于Pandas计算字典的加权平均值(高效向量化实现)
高效计算JSON字典列的加权平均值(向量化优先)
针对你DataFrame中存储为JSON字符串的字典列,以下是两种高效的向量化实现方案,优先保证性能和代码简洁性:
方法一:Numpy向量化元素处理(推荐)
这种方法直接对每行JSON字符串解析,利用Numpy的向量化运算计算加权平均,代码简洁且性能优异,适配数千行数据的场景:
- 导入依赖库
import pandas as pd import json import numpy as np
- 构造示例DataFrame(替换为你的实际数据)
df = pd.DataFrame({ 'data': [ '{"100":10,"50":3,"-90":2}', '{"100":70,"50":3,"-90":2,"-40":3}' ] })
- 定义加权平均计算函数
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()
- 应用函数到目标列
df['weighted_avg'] = df['data'].apply(compute_weighted_avg).round(3)
运行后,df['weighted_avg']会得到预期结果:[64.667, 87.824]。
方法二:Pandas堆叠分组计算
如果需要保留中间数据进行后续处理,可以采用json_normalize+stack的原生向量化组合:
- 解析JSON列并标准化为宽表
dict_series = df['data'].apply(json.loads) normalized_df = pd.json_normalize(dict_series)
- 将宽表转为长表,提取数值和权重
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)
- 按行索引分组计算加权平均
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
相关产品推荐
相关产品推荐

