如何向量化计算MultiIndex Pandas DataFrame的点积?
嘿,这问题我熟!完全可以用向量化矩阵乘法搞定,根本不需要用apply()或者循环,效率拉满。下面我一步步给你讲清楚怎么做:
步骤拆解与代码实现
首先,我们先明确两个核心DataFrame的结构:
toy_price:行是日期(时间序列),列是产品(juice/candy/pulp),存储各产品每日价格toy_yield:行是MultiIndex(config,product),列是原料(red_delicious/macintosh/fuji),存储对应配置下生产某产品所需原料的yield值
我们的目标是对每个时间点、每个config+原料组合,计算产品价格向量与**对应yield向量(产品维度)**的点积。用pandas的矩阵乘法运算符@就能直接实现:
# 1. 调整yield数据的形状:将config从行索引unstack到列,得到行=product,列=MultiIndex(config, 原料) yield_unstacked = toy_yield.unstack('config') # 2. 直接用矩阵乘法计算点积:toy_price(时间×产品) @ yield_unstacked(产品×(config,原料))→ 时间×(config,原料) result = toy_price @ yield_unstacked # 3. 可选:将列的MultiIndex调整为(config在前,原料在后)的顺序并排序,让结构更清晰 result.columns = result.columns.swaplevel(0, 1) result = result.sort_index(axis=1)
结果说明
最终的result就是你要的目标DataFrame:
- 行:保持原时间序列索引(2019-12-01到2019-12-10)
- 列:MultiIndex,上层是
config(a/b),下层是原料(red_delicious/macintosh/fuji) - 每个单元格:对应时间点、配置+原料组合下,产品价格与yield的点积(即
price_juice*yield_juice + price_candy*yield_candy + price_pulp*yield_pulp)
为什么这是最优解?
- 完全向量化:矩阵乘法是pandas底层基于numpy实现的向量化运算,比循环或
apply()快几个数量级,尤其是数据量很大的时候 - 代码简洁:只用两行核心代码就完成了计算,可读性强
- 自动对齐索引:pandas会自动处理
toy_price的产品列和yield_unstacked的产品行的对齐,不用担心维度不匹配的问题
如果你确实需要列的下层是产品而不是原料(可能描述里的小混淆),那只需要调整toy_yield的unstack方式:
# 如果目标列是MultiIndex(config, product),则unstack原料列并转置 yield_unstacked_product = toy_yield.unstack(axis=1) result_product = toy_price @ yield_unstacked_product.T
内容的提问来源于stack exchange,提问作者user3556757
相关产品推荐
相关产品推荐

