如何在DataFrame中批量用其他列减去最后一列(无风险利率)计算超额收益?
用Pandas快速计算多列的超额收益率
嘿,这个需求在pandas里完全可以用一行代码搞定,根本不用费劲去循环每一列,核心就是利用pandas的广播机制——它会自动把单列数据扩展成和多列匹配的维度来做运算。
给你两种常用的简洁实现方式:
方法一:直接切片运算
这是最直观的写法,一步到位:
# 假设你的DataFrame叫df excess_returns = df.iloc[:, :-1] - df.iloc[:, -1]
解释一下:
df.iloc[:, :-1]:选中除了最后一列之外的所有列(也就是你的40个行业收益率列)df.iloc[:, -1]:单独选中最后一列(无风险利率)- 直接相减后,pandas会自动把无风险利率列广播到每一行,和对应的行业收益率做减法,得到每一列的超额收益率
如果想把结果和原无风险利率列合并成新的DataFrame,只需要再加一步:
# 合并超额收益率和原无风险利率列 result_df = pd.concat([excess_returns, df.iloc[:, -1]], axis=1)
方法二:用sub方法(更灵活)
如果你需要调整运算的细节(比如处理缺失值),可以用pandas的sub方法:
excess_returns = df.iloc[:, :-1].sub(df.iloc[:, -1], axis=0)
这里的axis=0指定按行对齐广播,和直接减效果一样,但如果有特殊需求(比如填充缺失值),可以加fillna参数,比如:
# 遇到缺失值时用0填充再做减法 excess_returns = df.iloc[:, :-1].sub(df.iloc[:, -1], axis=0, fill_value=0)
小例子演示
比如我们构造一个小的测试DataFrame:
import pandas as pd import numpy as np # 模拟3个行业收益率+1个无风险利率列 data = { '行业A': [0.05, 0.03, -0.02], '行业B': [0.04, 0.06, 0.01], '行业C': [0.07, -0.01, 0.03], '无风险利率': [0.01, 0.01, 0.01] } df = pd.DataFrame(data) # 计算超额收益率 excess = df.iloc[:, :-1] - df.iloc[:, -1] print(excess)
输出结果就是每个行业的超额收益率:
行业A 行业B 行业C 0 0.04 0.03 0.06 1 0.02 0.05 -0.02 2 -0.03 0.00 0.02
这种方式不管你前面有多少列(哪怕不是40列)都能自动适配,完全不用修改代码,非常方便~
内容的提问来源于stack exchange,提问作者Niccola Tartaglia




