【问题标题】:Speeding up pandas multi row assignment with loc()使用 loc() 加速 pandas 多行分配
【发布时间】:2021-12-02 02:18:39
【问题描述】:

我正在尝试为基于条件选择的所有行的列分配值。在this one 这样的几个问题中讨论了实现这一目标的解决方案。 标准解决方案的语法如下:

df.loc[row_mask, cols] = assigned_val

不幸的是,这个标准解决方案需要很长时间。事实上,就我而言,我什至没有完成一项任务。

更新:有关我的数据框的更多信息:我的数据框中有大约 200 万行,我正在尝试更新我的数据框中的一列的值,以获取根据条件选择的行。平均而言,大约 10 行满足选择条件。

是否可以加快这个赋值操作?另外,对于 Pandas 的多项任务,是否有任何通用指南。

【问题讨论】:

  • 请多解释一下您的用例、数据框的大小等...以帮助加快速度,因为loc 是在大多数情况下一次访问多行的标准在这种情况下它足够快。

标签: pandas dataframe


【解决方案1】:

我相信 .loc.at 是您正在寻找的差异。 .at 意味着基于此answer 更快。

【讨论】:

  • at() 没有提供任何显着的加速,不幸的是。
【解决方案2】:

你可以试试 np.where。

这里是一个简单的 np.where 例子

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
df['B'] = np.where(df['B']< 50, 100000, df['B'])

np.where() do nothing if condition fails 还有一个例子。

在你的情况下,它可能是

df[col] = np.where(df[col]==row_condition, assigned_val, df[col])

我在想它可能会快一点,因为它直接进入 numpy,而不是通过 pandas 进入底层的 numpy 机制。本文讨论了大型数据集上的 Pandas 与 Numpy:https://towardsdatascience.com/speed-testing-pandas-vs-numpy-ffbf80070ee7#:~:text=Numpy%20was%20faster%20than%20Pandas,exception%20of%20simple%20arithmetic%20operations

【讨论】:

    猜你喜欢
    • 2018-05-24
    • 2021-06-30
    • 2017-03-05
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多