如何基于查找表正确为Pandas列实现向量化?
问题解决方法
错误原因
你生成的pgf和fgp是**多层索引(MultiIndex)**的Series,第一层是flow(或outlet),第二层是outlet(或flow)。你尝试的pgf[pw['flow']][pw['outlet']]写法逻辑错误:当你用pgf[pw['flow']]得到的是一组对应不同flow值的子Series,再用[pw['outlet']]索引时,Pandas会把整个pw['outlet']数组当作要匹配的索引集合,而非逐行对应匹配每个(flow, outlet)组合,因此触发KeyError。
三种向量化实现方案
方案1:利用元组映射(简洁直观)
因为pgf的索引是(flow, outlet)元组,我们可以把原表的flow和outlet列组合成元组,再用map匹配对应概率:
# 添加pgf对应的条件概率列 pw['p_p'] = pw.apply(lambda r: (r['flow'], r['outlet']), axis=1).map(pgf) # 添加fgp对应的条件概率列 pw['f_p'] = pw.apply(lambda r: (r['outlet'], r['flow']), axis=1).map(fgp)
方案2:转DataFrame后合并(适合保留中间概率表)
把pgf/fgp转为普通DataFrame,再通过merge和原表关联:
# 处理pgf pgf_df = pgf.reset_index(name='p_p') pw = pw.merge(pgf_df, on=['flow', 'outlet'], how='left') # 处理fgp fgp_df = fgp.reset_index(name='f_p') pw = pw.merge(fgp_df, on=['outlet', 'flow'], how='left')
方案3:直接用groupby.transform计算(最高效,无需中间变量)
不需要预先生成pgf/fgp,直接在原表上通过分组变换计算条件概率,这是最推荐的向量化方式:
# 计算P(outlet | flow) pw['p_p'] = pw.groupby('flow')['outlet'].transform( lambda x: x.map(x.value_counts(normalize=True)) ) # 计算P(flow | outlet) pw['f_p'] = pw.groupby('outlet')['flow'].transform( lambda x: x.map(x.value_counts(normalize=True)) )
内容的提问来源于stack exchange,提问作者Maxwell Shearman
相关产品推荐
相关产品推荐

