如何针对另一个DataFrame的各列执行逐行运算?
问题描述
现有两个DataFrame:
# df1 (形状 N×1) returns symbol A 3 AA 6 AAL 6 AAP 1 AAPL 4 # df2 (形状 1×M) symbol ^GSPC ^IXIC ^RUT returns 1 2 3
需要执行减法运算,得到如下输出:
output = perform_sub(df1, df2) ^GSPC ^IXIC ^RUT symbol A 3 - 1 3 - 2 3 - 3 AA 6 - 1 6 - 2 6 - 3 AAL 6 - 1 6 - 2 6 - 3 AAP 1 - 1 1 - 2 1 - 3 AAPL 4 - 1 4 - 2 4 - 3
尝试过df1.sub(df2)及搭配squeeze()的写法,结果全为NaN,原因是Pandas默认会同时匹配行索引和列名,而两个DataFrame的行索引、列名完全没有重叠,导致对齐失败。已知一种转numpy数组的解决方案,但需要更原生的Pandas实现。
原生Pandas解决方案
方法1:利用广播机制直接运算
通过提取df1的目标列并转为DataFrame,再与df2的目标行做减法,Pandas会自动完成广播:
output = df1['returns'].to_frame() - df2.loc['returns']
原理:
df1['returns'].to_frame()保留df1的行索引(symbol),生成一个N×1的DataFrame;df2.loc['returns']取出df2中索引为returns的行,得到一个索引为^GSPC/^IXIC/^RUT的Series;- 执行减法时,Pandas会自动将N×1的DataFrame广播为N×M的结构(每列重复df1的
returns值),再逐列对应减去df2 Series中的值,最终生成符合要求的输出。
方法2:使用apply逐行处理
如果需要更明确的逐行逻辑,可以用apply实现:
output = df1.apply(lambda row: row['returns'] - df2.loc['returns'], axis=1)
原理:
- 对df1的每一行,取出
returns的标量值,与df2的returns行(Series)做减法,得到一个对应df2列名的Series; apply会将所有行生成的Series组合成最终的DataFrame,自动继承df1的行索引和df2的列名。
方法3:调整索引/列名强制对齐
如果想利用Pandas的对齐机制,可以临时调整df2的行索引与df1的列名匹配:
# 将df2的行索引改为df1的列名 df2_aligned = df2.set_index(pd.Index(df1.columns)) output = df1.sub(df2_aligned, axis='columns')
原理:
- 修改df2的行索引为
returns(与df1的列名一致),此时两个DataFrame的列/行索引存在重叠; - 使用
sub方法并指定axis='columns',按列名对齐后完成广播运算。
内容的提问来源于stack exchange,提问作者Pratik K.
相关产品推荐
相关产品推荐

