所以我有一个csv文件,有三列x
、y
和rank
,如下所示:
x,y,rank
153271,30622,12
143400,125936,6
153718,31606,1
19680,168350,2
99291,47206,19
39208,112928,1
97469,169684,17
...
我想做的是遍历这个csv文件,找到所有x
和y
坐标,它们的rank
值为1。然后围绕秩为1的每个坐标“绘制”一个圆,并计算有多少值落在此圆内。然后我想计算这个圆内rank
值为“1”的所有值。通过这种方式,我可以计算出与其他“秩”值相比,这些圆中有多少“秩”“1”值
我用下面的代码成功地做到了这一点,但速度非常慢。打印“排名”为“1”的每一行的WinPercentage大约需要3秒钟。然而,数据集相当大。它有32万行,其中1/64行的“秩”值为“1”
我刚刚开始使用python和pandas,所以这里的一切对我来说都是全新的。我只是想知道是否有更有效的方法通过数据进行迭代。我曾尝试在stackoverflow上进行谷歌搜索,但没有找到任何有用的东西
import csv
import pandas as pd
allDF = pd.read_csv ('players-with-rank-data.csv')
winnerDF = allDF[allDF['rank'] == 1]
def WinPercentageCalculator(allDF, winnerDF):
radius = 20000
for i in winnerDF.index:
center_x = allDF.at[i,'x']
center_y = allDF.at[i,'y']
jumperCountInsideRadius = 0
winnerCountInsideRadius = 0
for row in allDF.index:
x = allDF.at[row,'x']
y = allDF.at[row,'y']
dx = abs(x - center_x)
dy = abs(-y - -center_y)
if (dx*dx)+(dy*dy) <= (radius*radius):
jumperCountInsideRadius += 1
rank = allDF.at[row,'rank']
if rank == 1:
winnerCountInsideRadius += 1
winPercentage = (float(winnerCountInsideRadius) / float(jumperCountInsideRadius))
print(str(winPercentage))
WinPercentageCalculator(allDF, winnerDF)
这将减少几乎一半的时间复杂性@Ode
相关问题 更多 >
编程相关推荐