我目前正在尝试找到一种快速推导列的方法。更确切地说,我有两个数据框:第一个有两列(' 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
有没有办法在没有循环的情况下做到这一点?通过矢量方式?
感谢您的时间。
答案 0 :(得分:0)
对于这种情况,我假设您可以根据某些键加入这些数据框,或者它们的索引是相同的。
如果是第一种情况:
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"])
答案 1 :(得分:0)
您可以尝试:
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