如何用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)
问题分析
你的代码有两个核心问题:
B.iloc[x,:]取出来的是一个Series,和dfA列相乘后得到的还是Series,用np.stack会把这些Series按行堆叠,最后得到的C2是转置后的结果,和期望的行结构反过来了。- 你在循环里每次都重新赋值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
相关产品推荐
相关产品推荐

