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



我想我在计算时间方面有问题。

我想在一个32万行,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

目标是在考虑到前一场比赛的情况下,确定给定比赛的胜场数和输场数,这适用于每个俱乐部。

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

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

另一个困扰我的是,我有至少2行完全相同的日期/小时,因为我有至少两个相同的日期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")

最新更新