首页 > 解决方案 > 比较具有相同形状的两个数据帧并迭代计算 df1 - line1 到 df2 - line1 的 pct_change 的行

问题描述

我在计算两个具有相同形状(datetimeindex + 0-2000 列)的数据帧的差异(以 % 为单位)时遇到问题。我想将 df1 的行的值与 d2 的行(df1 line1 与 df2 line1,df1 line2 与 df2 line2 等)进行比较,并计算这两个值之间的差异并将结果存储在一个新的数据框中。我想按列比较属于同一时间(例如 12:01)的值,但数据框具有来自不同日期的值(时间相同)。

这些是示例数据框:

df1

                       A       B       
time      
2019-04-20 12:01       12     0.5      
2019-04-20 12:02       14      1      
2019-04-20 12:03       15     0.2     
2019-04-20 12:04       18      5       
2019-04-20 12:05       9       6       

df2:

                       A       B       
time      
2019-04-21 12:01       10     0.5      
2019-04-21 12:02       11     1.5    
2019-04-21 12:03        5      4      
2019-04-21 12:04       20      3       
2019-04-21 12:05        3      6     

预期输出:

             A          B       
time      
12:01       -16.67       0      
12:02       -21.43      50     
12:03       -66.67    1900     
12:04        11.11     -40       
12:05       -66.67       0      

作为第一步,我已经尝试过 pandas 合并和连接函数,但它们没有给我想要的输出。

然后我尝试编写一个函数:

def merge_calculate(df1, df2):

    if len(df1) == len(df2):
    return(((df2.values - df1.values)/df1.values)*100) #df1.values = start value, df2.values = end value

该函数给了我一个数组,但我不确定计算是否按照我想要的方式完成。

我很感激任何意见!谢谢

标签: pythonpandasdataframecompare

解决方案


import datetime as dt
diff = -(df1.values - df2.values)/df1.values*100
date_time = [dt.datetime.strptime(d, "%Y-%m-%d %H:%M") for d in list(df1.index)]
time = [dt.datetime.time(d) for d in date_time]
df3=pd.DataFrame(data=diff,columns=df1.columns,index=time)

解释:

  • diff是df1和df2的比较,是一个二维的numpy数组
  • 您需要为 diff 分配索引和列,以使其成为数据框:
  • data=diff为数据框分配数据
  • columns简单地等于columns=df1.columns
  • index=timetime你从中提取的datetime

print (df3)给你输出:

                 A       B
    12:01:00 -16.666667    -0.0
    12:02:00 -21.428571    50.0
    12:03:00 -66.666667  1900.0
    12:04:00  11.111111   -40.0
    12:05:00 -66.666667    -0.0

推荐阅读