You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何针对另一个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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:57:26