我如何优化我的 for 循环以便能够在 320000 行 DataFrame table 上 运行 它?

How can I optimize my for loop in order to be able to run it on a 320000 lines DataFrame table?

我觉得我的时间计算有问题。

我想 运行 将此代码放在 320 000 行、6 列的 DataFrame 上:

index_data = data["clubid"].index.tolist()

for i in index_data:
    for j in index_data:
        if data["clubid"][i] == data["clubid"][j]:
            if data["win_bool"][i] == 1:
                if (data["startdate"][i] >= data["startdate"][j]) & (
                    data["win_bool"][j] == 1
                ):
                    NW_tot[i] += 1
            else:
                if (data["startdate"][i] >= data["startdate"][j]) & (
                    data["win_bool"][j] == 0
                ):
                    NL_tot[i] += 1

objective是在考虑到上一场比赛的情况下确定给定比赛的胜负数,这是针对每个俱乐部的。

问题是,我没有收到错误,但我也从未获得任何结果。 当我尝试使用较小的 DataFrame ( data[0:1000] ) 时,我在 13 秒内得到了结果。这就是为什么我认为这是一个时间计算问题。

我也尝试先使用 groupby("clubid"),然后对每个组执行我的 for 循环,但我淹死了自己。

还有一些困扰我的事情,我至少有 2 行完全相同 date/hour,因为 1 场比赛我至少有两个相同的日期。因此,我无法将日期放入索引中。

你能帮我解决这些问题吗?

正如我在上面的评论中指出的,我认为你可以简单地按组对 win_bool 的向量求和。如果日期已排序,这应该等同于您的循环,对吗?

import pandas as pd
dat = pd.DataFrame({
    "win_bool":[0,0,1,0,1,1,1,0,1,1,1,1,1,1,0],
    "clubid":  [1,1,1,1,1,1,1,2,2,2,2,2,2,2,2],
    "date"  :  [1,2,1,2,3,4,5,1,2,1,2,3,4,5,6],
    "othercol":["a","b","b","b","b","b","b","b","b","b","b","b","b","b","b"]
    })


temp = dat[["clubid", "win_bool"]].groupby("clubid")
NW_tot = temp.sum()
NL_tot = temp.count()
NL_tot = NL_tot["win_bool"] - NW_tot["win_bool"]

如果您有重复的日期使计数膨胀,您可以先按日期(组内)删除重复项:

# drop duplicate dates
temp = dat.drop_duplicates(["clubid", "date"])[["clubid", "win_bool"]].groupby("clubid")