有没有办法对当前迭代 Pandas 数据帧中的行的代码进行矢量化?

Is there a way to vectorize code that currently iterates over rows in a Pandas dataframe?

我现在有一些代码可以正常工作,但速度太慢了。我正在尝试将 Pandas 数据框中每一行的加权平方和相加。我想对这些操作进行矢量化处理——这似乎 运行 快得多——但代码中的一个错误使我的矢量化尝试失败了。

totalDist = 0.0
    
for index, row in pU.iterrows():
    totalDist += (row['distance'][row['schoolChoice']]**2.0*float(row['students']))

该行有'students'(一个整数),distance(一个长度为n的numpy数组),和schoolChoice(一个小于或等于n-1的整数,指定距离数组I的哪个元素'用于计算)。基本上,我从 numpy 数组中提取特定于行的值。我已经使用了 df.lookup,但实际上它似乎更慢并且正在被弃用。关于如何使 运行 更快的任何建议?提前致谢!

如果一切都失败了,你可以在每一行上使用 .apply()

totalSum = df.apply(lambda row: row.distance[row.schoolChoice] ** 2 * row.students, axis=1).sum()

要加快速度,您可以导入 numpy

totalSum = (numpy.stack(df.distance)[range(len(df.schoolChoice)), df.schoolChoice] ** 2 * df.students).sum()

numpy 方法要求每行的距离长度相同 - 但是,如果需要,可以将它们填充到相同的长度。 (尽管这可能会影响任何收益。)

在 150,000 行的 df 上进行测试,例如:

         distance  schoolChoice  students
0       [1, 2, 3]             0         4
1       [4, 5, 6]             2         5
2       [7, 8, 9]             2         6
3       [1, 2, 3]             0         4
4       [4, 5, 6]             2         5

时间安排:

         method    time
0      for loop   15.9s
1      df.apply    4.1s
2         numpy    0.7s