如何在Pandas中以列为权重计算列的加权和?
解决DataFrame列间sumproduct(加权和)的问题
问题原因
你之前的代码失败是因为pandas DataFrame的乘法操作会按列名对齐:state1/state2与pop1/pop2列名不匹配,相乘后所有元素变为NaN,求和时跳过NaN最终得到0。
可行解决方案
以下是几种高效实现方式:
方法1:直接使用数值数组运算(最直观)
通过.values或.to_numpy()获取DataFrame的数值矩阵,绕开列名对齐限制,逐元素相乘后按行求和:
import pandas as pd df_data = pd.DataFrame.from_dict({'state1' : [1, 2, 3], 'state2' : [2, 4, 6], 'pop1' : [1, 1, 1], 'pop2' : [1, 1, 2]}) df_data['sumproduct'] = (df_data[['state1', 'state2']].values * df_data[['pop1', 'pop2']].values).sum(axis=1)
方法2:使用矩阵点积(效率最高)
利用dot方法计算每行state向量与pop向量的点积,本质就是加权和:
df_data['sumproduct'] = df_data[['state1', 'state2']].dot(df_data[['pop1', 'pop2']].T)
方法3:对齐列名后运算
重命名其中一组列名,让两组列名匹配后再相乘求和:
state_df = df_data[['state1', 'state2']] pop_df = df_data[['pop1', 'pop2']].rename(columns={'pop1':'state1', 'pop2':'state2'}) df_data['sumproduct'] = (state_df * pop_df).sum(axis=1)
方法4:逐行自定义计算(适合小数据集)
用apply逐行执行加权和计算,缺点是大数据下效率较低:
df_data['sumproduct'] = df_data.apply(lambda x: x['state1']*x['pop1'] + x['state2']*x['pop2'], axis=1)
最终结果
执行任意一种方法后,df_data都会生成你需要的sumproduct列:
state1 state2 pop1 pop2 sumproduct 0 1 2 1 1 3 1 2 4 1 1 6 2 3 6 1 2 15
内容的提问来源于stack exchange,提问作者Faraz Masroor
相关产品推荐
相关产品推荐

