我如何优化我的 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")
我觉得我的时间计算有问题。
我想 运行 将此代码放在 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")