对pandas数据帧的筛选条件列表进行循环并进行一些计算的最快方法是什么?

2024-10-06 06:53:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我经常发现自己有一个过滤器列表,我需要应用到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}$

Tags: import过滤器df列表datetimeddrowprint
1条回答
网友
1楼 · 发布于 2024-10-06 06:53:54

尝试使用pandas.DataFrame.apply()用于计算。在

文件:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html

使用您的代码:

%%timeit
run()
205 ms ± 33.7 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

适应:

^{pr2}$

不是一个很大的差别,但在这个例子中,我们不能做得更好。。。在

相关问题 更多 >