我想我在计算时间方面有问题。
我想在一个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")