如何实现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
相关产品推荐
相关产品推荐

