在python-pandas数据帧中分配循环以提高性能



我得到了两个数据帧dfA和dfB。在dfA中有不同的事件,每个事件都有一个StartDate(YYYYmmddHHMM(和一个EndDate。在dfB中,存在不同测量站(SID(的温度值(Temp(。每个值还有一个时间戳(YYYYmmddHHMM(。

脚本应计算开始日期和结束日期内dfA中每个事件的平均温度,并将平均温度在0°C和-5°C之间的测量站数量添加到a中。

下面的例子工作得很好,但对于大的数据帧,速度非常慢。这就是为什么我想摆脱循环。

import pandas as pd
dfA = pd.DataFrame({'StartDate':[201601010200, 201601050600, 201602151900, 201812012000],'EndDate':[201601010400, 201601051000, 201602152000, 201812020300]})
dfB = pd.DataFrame({'SID':[1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 3],'Timestamp':[201601010100, 201601010200, 201601010300, 201601010400, 201601010500, 201601010100, 201601010200, 201601010100, 201601010200, 201601010300, 201601010400, 201601010500], 'Temp':[1.2, -1.6, -2.3, 2.0, -5.0, 1.3, 2.6, 8.1, 9.3, -10.5, -20.4, 3.1]})
A = 0
for row in dfA.itertuples():
cStartDate = row.StartDate
cEndDate = row.EndDate
dfC = dfB[(dfB.Timestamp >= cStartDate) & (dfB.Timestamp <= cEndDate)].groupby('SID').mean()
A += dfC[(dfC.Temp <= 0) & (dfC.Temp >= -5)].shape[0]
print('A: ' + str(A))

这是一个交叉合并和查询的例子。但是,由于某些原因,查询无法处理样本数据。这里有一个解决方案:

new_df = (dfA.assign(dummy=1)
.merge(dfB.assign(dummy=1), on='dummy')
)
(new_df[new_df.Timestamp.between(new_df.StartDate, new_df.EndDate)]   # filter the time between each StartDate and EndDate
.groupby('SID').Temp.mean()                                        # calculate mean of temperature for each SID
.between(-5,0)                                                     # filter those between -5 and 0
.sum()
)
# outputs 1

最新更新