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

如何向量化计算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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:16:28