【问题标题】:fast way to get mean,sum,ect.. between two dates depending on an other Dataframe根据另一个数据框在两个日期之间获取平均值、总和等的快速方法
【发布时间】:2018-02-03 16:14:41
【问题描述】:

我目前正在尝试找到一种快速导出列的方法。更准确地说,我有两个数据框:第一个有两列('Open_date','Close_date'),第二个是时间序列,索引中包含日期,列中包含“利率”。 例如,我想快速获得第一个数据框中所有行的这两个日期之间的利率平均值。

因为一张图片往往胜过 1000 字,所以这里是缓慢的做法:

df1 =pd.DataFrame({'Open_date' : np.array(pd.date_range('20130101',periods = 6 )),
              'Close_date' : np.array(pd.date_range('20130104',periods = 6 ))
                    })
df1=df1[ [ 'Open_date','Close_date']]


df2 = pd.DataFrame(np.random.randn(20,1), index=pd.date_range('20130101',periods = 20), columns= ['interest_rate'])

list=[]
for i in range(df1.shape[0]):
     list.append(df2.loc[df1['Open_date'][i]:df1['Close_date'][i],:]['interest_rate'].mean())

df1['mean_interest_rate'] = list

有没有办法在没有循环的情况下做到这一点?通过矢量方式?

感谢您的宝贵时间。

【问题讨论】:

  • 修复我的答案?我不明白..你的意思是我需要在我的问题中添加数据框的例子吗?
  • *问题...我的错。是的!我愿意。
  • 能否提供可重现的样本数据:)
  • 我正在做,请稍等!
  • 现在更清楚了吗?

标签: python pandas dataframe


【解决方案1】:

你可以试试:

df=df1.copy()#keep the original df1
df1['list']=df1.apply(lambda x : pd.date_range(start =x['Open_date'],end=x['Close_date'],freq='D').tolist(),axis=1)
df1=df1['list'].apply(pd.Series).stack().to_frame().rename(columns={0:'Date'})
df1['value']=df1.Date.map(df2.interest_rate)
df1.groupby(level=0).mean()


Out[377]: 
      value
0  0.617968
1  0.832764
2  0.606520
3  0.883619
4 -0.337306
5 -0.506201


pd.concat([df,df1.groupby(level=0).mean()],axis=1)

Out[389]: 
   Open_date Close_date     value
0 2013-01-01 2013-01-04 -0.206509
1 2013-01-02 2013-01-05  0.058621
2 2013-01-03 2013-01-06 -0.041077
3 2013-01-04 2013-01-07 -0.254862
4 2013-01-05 2013-01-08 -0.638243
5 2013-01-06 2013-01-09 -0.891294

【讨论】:

    【解决方案2】:

    对于这种情况,我假设您可以基于某些键或它们的索引相同来连接这些数据帧。

    如果是第一种情况:

    df = pd.merge(df1,df2,on="someCommonColumn",how="inner") 
    

    如果是第二种情况:

    df = df2
    df["endDate"] = df1["endDate"]
    df["startDate"] = df1["startDate"]
    

    要查找列的平均值,例如“interestRate”,在两个日期之间,请使用条件语句,例如:

    import numpy 
    meanInterestRate = numpy.mean(df.loc[(df["startDate"] > someDate)&(df["endDate"] < someOtherDate),"interestRate"])
    

    【讨论】:

    • 但是当您加入或合并时,您将丢失需要导出两个日期之间平均值的信息,更准确地说,我们丢失了 Open_date 和 Close_date 之间的利率,不是吗?
    • 否,因为目标是直接将利率归因于日期范围。平均值将基于连接数据框的子集。但是,正如答案开头所指定的那样,这需要一致的索引或要加入的一个或多个列。
    • 是的,但我没有一致的索引或键..谢谢你的帮助!
    • 那么抱歉,这种方法行不通。我很想知道你将如何在没有通用键的情况下实现这一目标。
    • 你可以看看上面文的答案!
    猜你喜欢
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多