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

如何实现Pandas多DataFrame按列与另一DataFrame对应行元素相乘

实现方案

你可以借助Pandas的广播特性配合循环完成需求,不需要手动逐列遍历,适配从文件批量读取DataFrame的场景,实现代码如下:

步骤说明

  • 先将所有待处理的DataFrame存入一个列表dfs,如果是从文件读取,读入时直接追加到该列表即可,不需要单独定义a/b/c变量
  • 循环遍历列表的索引和对应DataFrame,直接用x的对应行与DataFrame做乘法运算,Pandas会自动将行内的每个元素匹配到对应列做整列相乘,同时保留原始NaN值

完整代码

import pandas as pd
import numpy as np

# -------------------- 以下是示例数据 --------------------
d = {'aa_10' : pd.Series([np.nan, 2, 3, 4]),
     'bb_11' : pd.Series([6, np.nan, 8, 9]),
     'cc_12' : pd.Series([1, 2, np.nan, 4]),
     'dd_13' : pd.Series([6, 7, 8, np.nan])}
a = pd.DataFrame(d)

d = {'aa_10' : pd.Series([np.nan, 12, 13, 14]),
     'bb_11' : pd.Series([16, np.nan, 18, 19]),
     'cc_12' : pd.Series([11, 12, np.nan, 14]),
     'dd_13' : pd.Series([16, 17, 18, np.nan])}
b = pd.DataFrame(d)

d = {'aa_10' : pd.Series([np.nan, 21, 31, 41]),
     'bb_11' : pd.Series([61, np.nan, 81, 91]),
     'cc_12' : pd.Series([11, 21, np.nan, 41]),
     'dd_13' : pd.Series([61, 71, 81, np.nan])}
c = pd.DataFrame(d)

d = {'aa_10' : pd.Series([1, 2, 3]),
     'bb_11' : pd.Series([6, 7, 8]),
     'cc_12' : pd.Series([10, 11, 12]),
     'dd_13' : pd.Series([13, 14, 15])}
x = pd.DataFrame(d)
# -------------------- 示例数据结束 --------------------

# 核心实现逻辑
# 1. 待处理DataFrame存入列表,文件读取场景下可以边读边append
dfs = [a, b, c]
processed_dfs = []

for idx, df in enumerate(dfs):
    # 可选:如果不确定x的列顺序是否和df一致,可以加下行强制对齐列顺序
    # x = x[df.columns]
    processed_df = df * x.iloc[idx]
    processed_dfs.append(processed_df)

# 查看处理后的结果
# 处理后的a
print(processed_dfs[0])
# 处理后的b
print(processed_dfs[1])
# 处理后的c
print(processed_dfs[2])

说明

该方案支持任意数量的待处理DataFrame,无需修改循环逻辑,仅需调整dfs列表的内容即可,向量化运算的效率也远高于逐列循环遍历。


内容的提问来源于stack exchange,提问作者R S John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:15:03