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

如何用Pandas实现DataFrame按列匹配元素乘法运算?

问题与解决方案

现有数据

dfA:

1   2   5
2   3   6
3   3   8

dfB:

2
4
1

需求说明

把dfB的第1个元素和dfA第1列所有元素相乘,第2个元素和dfA第2列所有元素相乘,以此类推,最终要得到的结果是:

2 8  5
4 12 6
6 12 8

你写的问题代码

你尝试了下面这段代码,但没法正确得到结果并存入df C2:

empty_C = []
for x in range(3):
    C = A.iloc[:,x] * B.iloc[x,:]
    empty_C.append(C)
    C2 = np.stack(empty_C) 

问题分析

你的代码有两个核心问题:

  1. B.iloc[x,:]取出来的是一个Series,和dfA列相乘后得到的还是Series,用np.stack会把这些Series按行堆叠,最后得到的C2是转置后的结果,和期望的行结构反过来了。
  2. 你在循环里每次都重新赋值C2,这完全没必要,应该等所有列处理完再做堆叠操作。

修正方案

方案一:调整你的循环代码

修改后可以得到正确结果:

import pandas as pd
import numpy as np

# 先构造示例数据(如果已经有A和B可以跳过这部分)
A = pd.DataFrame([[1,2,5],[2,3,6],[3,3,8]])
B = pd.DataFrame([2,4,1])

empty_C = []
for x in range(3):
    # 直接取出B的单个数值,避免Series的广播问题
    val = B.iloc[x, 0]
    C = A.iloc[:, x] * val
    empty_C.append(C)
# 堆叠后转置,再转为DataFrame
C2 = pd.DataFrame(np.stack(empty_C).T)
print(C2)

方案二:更简洁的广播运算(推荐)

不用写循环,直接利用Pandas的广播特性就能搞定,代码更简洁高效:

# 方法1:利用numpy数组广播
C2 = A * B.values.flatten()

# 方法2:用Pandas的multiply方法,更直观
C2 = A.multiply(B.squeeze(), axis=1)

print(C2)

解释:B.squeeze()把dfB转换成一维的Series,multiply指定axis=1后,会自动让B的每个元素对应dfA的每一列做乘法,完美匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:28:23