Python/Pandas - 性能 - 尝试在全列操作中跳过 for 循环

标签 python performance pandas for-loop

我有一个名为目标的数据框:

target:

          group  estimation_error
170  64.22-1-00          0.061829
72   64.22-1-00          2.242214
121  35.12-3-00         31.960277
99   64.22-1-00          4.819315
19   35.12-3-00          0.850597

我想创建一个名为group_error的新列,它是同一组行的误差中位数。它看起来像这样:

          group  estimation_error median_group_error
170  64.22-1-00          0.061829           2.242214
72   64.22-1-00          2.242214           2.242214
121  35.12-3-00         31.960277          16.405437
99   64.22-1-00          4.819315           2.242214
19   35.12-3-00          0.850597          16.405437

我可以通过执行以下操作来做到这一点:

target['group_median_error']=""
groups=target.groupby('group')

for i in target.index:
    try:
        target['group_median_error'][i]=(groups.get_group(target.group[i])).estimation_error.median()
    except KeyError:
        pass

但是,由于这是一个很大的数据帧,因此花费的时间太长。我相信,如果我可以跳过 for 循环,我将获得相当大的性能提升。

出于这个目的,我尝试用以下内容替换 for 循环:

target['group_median_error']=(groups.get_group(target.group)).estimation_error.median()

但是它让我遇到以下错误:

TypeError: 'Series' objects are mutable, thus they cannot be hashed

然后我提出问题:

  • 有没有办法在不通过 for 循环的情况下执行相同的操作?
  • 跳过该循环会提高性能吗?

最佳答案

我们可以用矢量化(不循环)的方式来实现:

In [11]: df['median_group_error'] = \
            df.groupby('group')['estimation_error'].transform('median')

In [12]: df
Out[12]:
          group  estimation_error  median_group_error
170  64.22-1-00          0.061829            2.242214
72   64.22-1-00          2.242214            2.242214
121  35.12-3-00         31.960277           16.405437
99   64.22-1-00          4.819315            2.242214
19   35.12-3-00          0.850597           16.405437

关于Python/Pandas - 性能 - 尝试在全列操作中跳过 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44808468/

相关文章:

python - 获取 matplotlib colorbar tick outside data limits 与 boundaries 关键字一起使用

javascript - 使用 Selenium webdriver 和 Python 获取完全呈现的 HTML

python - Bottle.py 与 Beaker 的 session

python - 为什么 `word == word[::-1]` 比 Python 中的算法解决方案更快地测试回文?

Python pandas 复杂的分组依据

Python - 将货币代码转换为其符号

java - 在 Java 中使用 final 关键字会提高性能吗?

mysql - Django 为 OR 子句生成慢查询(左外连接而不是联合)

python - 根据 Pandas 中唯一行值的数量添加新列

python - 基于其他列创建新列作为另一个数据帧的索引