通过具有多条IFS语句的数据帧优化循环和计算

2024-06-02 09:58:50 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个csv文件,有三列xyrank,如下所示:

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文件,找到所有xy坐标,它们的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)

Tags: 文件csv数据pandasatrowcenterrank
1条回答
网友
1楼 · 发布于 2024-06-02 09:58:50

这将减少几乎一半的时间复杂性@Ode

import csv
import pandas as pd

allDF = pd.read_csv ('players-with-rank-data.csv')
winnerDF = allDF[allDF['rank'] == 1]

radius = 20000

for i in winnerDF.index:
    center_x = allDF.at[i,'x']
    center_y = allDF.at[i,'y']

    #Check and resolve the minor changes w.r.t data, as data not visible its blind folded code
    jumperCountInsideRadius = ( allDF['x'].subtract(center_x).pow(2) + 
                                allDF['y'].subtract(center_y).pow(2)  ).lt(radius**2).sum()
    winnerCountInsideRadius = jumperCountInsideRadius.eq(1).sum()


    winPercentage = (float(winnerCountInsideRadius) / float(jumperCountInsideRadius))
    print(str(winPercentage))

相关问题 更多 >