Pandas实现不同维度两个时间序列DataFrame逐列差值计算
逐列计算DataFrame行差值的实现方法
直接利用pandas的向量化广播特性即可实现,核心计算仅需1行代码,性能远高于遍历或apply方案。
完整实现代码
import pandas as pd import numpy as np # 构造示例数据 df1 = pd.DataFrame({ 'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'], '01K W':[1.2, 0.4, 0.2, -0.4], '02K W':[3.5, 3.2, 'nan', 'nan'], '03K W':[-1, -2.3, 0.3, 2.4], '04K W':[1.5, 2.6, 3.2, 4.2]}) df2 = pd.DataFrame({ 'Date':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04'], 'K W':[1, 1.5, 1.2, 0.8]}) # 预处理:将字符串格式的nan转为pandas识别的空值 df1 = df1.replace('nan', np.nan) # 按日期对齐行,避免行顺序错乱导致计算错误 df1 = df1.set_index('Date') df2 = df2.set_index('Date') # 核心计算:axis=0指定按行匹配,df1所有列逐行减去df2对应行的K W值 # 若需要取差值绝对值,在外层加abs()即可匹配示例输出:df1.sub(df2['K W'], axis=0).abs().reset_index() df3 = df1.sub(df2['K W'], axis=0).reset_index()
验证说明
运行后输出的df3符合差值计算逻辑,空值会自动保留无需额外处理,加绝对值后和你给出的示例结果完全一致。
注意事项
- 若已经能保证两个DataFrame的行顺序、行数量完全匹配,可以省略
set_index对齐步骤,直接用df1.iloc[:,1:](跳过Date列)减df2.iloc[:,1]即可 - 该方案为向量化运算,数据量越大性能优势越明显,远优于循环遍历每列计算的方案
内容的提问来源于stack exchange,提问作者fjurt
相关产品推荐
相关产品推荐

