Python如何将DataFrame每行乘另一DataFrame对应列后按行求和生成新列
问题根因
你使用df_ret.mul(df2.weight)得到全NaN结果的核心原因是pandas的二元运算默认按索引对齐:df2.weight的索引是默认生成的整数序列0、1、2、3,和df_ret的列名FR、GR、IT、F完全不匹配,运算时找不到对应位置就会返回NaN。
解决方案
只需要先将权重的索引和df_ret的列名对齐,再进行运算即可,有两种常用实现方式:
import pandas as pd # 示例数据 df = pd.DataFrame({ 'FR': [4.0405, 4.0963, 4.3149], 'GR': [1.7246, 1.7482, 1.8519], 'IT': [804.74, 810.01, 860.13], 'F': [8.4, 10.01, 60.3]}, index=['1980-01-01', '1980-02-01', '1980-03-01']) df_ret = df.pct_change() df2 = pd.DataFrame({'symbol':['FR','GR','IT','F'], 'weight' : [0.2,0.3,0.1,0.4]}) # 第一步:将symbol设为权重的索引,和df_ret的列名对齐 weight_s = df2.set_index('symbol')['weight'] # 方案1:逐列对齐相乘后按行求和 df['port'] = df_ret.mul(weight_s, axis=1).sum(axis=1) # 方案2:用矩阵点积更简洁高效,自动完成对应相乘求和的操作 # df['port'] = df_ret.dot(weight_s)
补充说明
df_ret第一行是pct_change生成的空值,所以最终port列第一行也会是空值,符合业务逻辑,如果需要填充可以在求和后追加.fillna(0)等处理。
内容的提问来源于stack exchange,提问作者sam_sam
相关产品推荐
相关产品推荐

