我经常发现自己有一个过滤器列表,我需要应用到pandas数据帧。我应用每个过滤器并进行一些计算,但这通常会导致代码缓慢。我想优化性能。我已经创建了一个慢解决方案的示例,它过滤日期范围列表中的数据帧,并计算与我日期范围匹配的行的列总和,然后将此值分配给与日期范围开始匹配的日期:
import numpy as np
import pandas as pd
import datetime
def generateTestDataFrame(N=50, windowSizeInDays=5):
dd = {"AsOfDate" : [],
"WindowEndDate" : [],
"X" : []}
d = datetime.date.today()
for i in range(N):
dd["AsOfDate"].append(d)
dd["WindowEndDate"].append(d + datetime.timedelta(days=windowSizeInDays))
dd["X"].append(float(i))
d = d + datetime.timedelta(days=1)
newDf = pd.DataFrame(dd)
return newDf
def run():
numRows = 50
windowSizeInDays = 5
print "NumRows: %s" % (numRows)
print "WindowSizeInDays: %s" % (windowSizeInDays)
df = generateTestDataFrame(numRows, windowSizeInDays)
newAggColumnName = "SumOverNdays"
df[newAggColumnName] = np.nan # Initialize the column to nan
for i in range(df.shape[0]):
row_i = df.iloc[i]
startDate = row_i["AsOfDate"]
endDate = row_i["WindowEndDate"]
sumAggOverNdays = df.loc[ (df["AsOfDate"] >= startDate) & (df["AsOfDate"] < endDate) ]["X"].sum()
df.loc[df["AsOfDate"] == startDate, newAggColumnName] = sumAggOverNdays
print df.head(10)
if __name__ == "__main__":
run()
这将产生以下输出:
^{pr2}$
尝试使用pandas.DataFrame.apply()用于计算。在
文件:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html
使用您的代码:
适应:
^{pr2}$不是一个很大的差别,但在这个例子中,我们不能做得更好。。。在
相关问题 更多 >
编程相关推荐