如何高效按行列位置对两个Pandas DataFrame执行对应位置计算
实现方案
完全不需要用pd.merge,只要两个DataFrame的行索引、列名保持对应,直接用pandas原生向量化运算就可以实现,效率比merge高很多,也不会出现合并后列名冲突、数据错位的问题。
核心实现逻辑
pandas的DataFrame做算术运算时,默认会自动按行索引、列名对齐对应位置的值,直接套用计算公式写代码即可:
import pandas as pd import numpy as np # 先把df2调整为和df1完全一致的行列结构,避免顺序错乱导致计算错误 df2_aligned = df2.reindex_like(df1) # 按基准公式计算百分比差值 df_master = (df1 - df2_aligned) / df1
示例验证
用给出的样例数据跑上述代码:
# 构造样例df1 df1 = pd.DataFrame( [[1.0, 0.55, 0.35], [1.0, 0.40, 0.20]], columns=[0,1,2] ) df1.index.name = "period_number" # 构造样例df2 df2 = pd.DataFrame( [[1.0, 0.30, 0], [1.0, 0.20, 0]], columns=[0,1,2] ) df2.index.name = "period_number" # 执行计算 df2_aligned = df2.reindex_like(df1) df_master = (df1 - df2_aligned) / df1
输出的df_master结果和预期完全匹配:
| period_number | 0 | 1 | 2 |
|---|---|---|---|
| 0 | 0.0 | 0.4545... | 1.0 |
| 1 | 0.0 | 0.5 | 1.0 |
注意事项
- 如果df1中存在0值,计算时会产生
inf(无穷大)的无效结果,可以加一步替换处理:df_master = df_master.replace([np.inf, -np.inf], np.nan) - 不要用merge处理这类场景:merge是按关联键做表连接,会自动给重名列加后缀,后续还要手动逐列匹配计算,不仅代码冗余,遇到重复关联键时还容易出现数据膨胀的问题,完全不适配行列一一对应的计算需求。
- 如果两个df的索引不是默认的位置索引,只要索引值和列名能一一对应,上述代码依然可以正常运行,不需要额外调整。
内容的提问来源于stack exchange,提问作者titutubs
相关产品推荐
相关产品推荐

