有没有比在 python 中使用 loc 更快的方法来根据现有数据框填充数据框中的新列?

Posted

技术标签:

【中文标题】有没有比在 python 中使用 loc 更快的方法来根据现有数据框填充数据框中的新列?【英文标题】:Is there a faster way to fill in a new column in a dataframe based on exsiting ones than using loc in python? 【发布时间】:2021-03-01 22:55:02 【问题描述】:

我有一个数据框,其中包含工厂每天生产的产品总数,但它是一个累积字段,而不是每日值。我试图通过从第二天的数字中减去每天的累积数字来计算每日值。这是我正在使用的代码。我正在使用loc 来确保它将新值插入到原始数据框中。这样,1000 行需要 10 秒,这有点长,因为原始数据要大得多。想知道是否有更快的方法。

之前:

    date        sum     
0   2020-03-24  10  
1   2020-03-25  50  
2   2020-03-26  90  
3   2020-03-27  140 
4   2020-03-28  180 

代码:

for i in range(1, 1000):
    data.loc[i, 'daily_products'] = data.loc[i, 'sum'] - data.loc[i-1, 'sum']

之后:

    date        sum     daily_products
0   2020-03-24  10  
1   2020-03-25  50      40
2   2020-03-26  90      40
3   2020-03-27  140     50
4   2020-03-28  180     40

以及 1000 行所需的时间:

Total runtime of the program is 9.468996286392212

【问题讨论】:

data['daily_products'] = data['sum'] - data['sum'].shift(-1) 呢? 或者只是data["sum"].diff() 【参考方案1】:

让我们使用

data['daily_products'] = data['sum'].diff()

每个循环 159 µs ± 3.66 µs(平均值 ± 标准偏差,7 次运行,10000 个循环 每个)

for i in range(1, len(data)-1):
    data.loc[i, 'daily_products'] = data.loc[i, 'sum'] - data.loc[i-1, 'sum']

每个循环 716 µs ± 26.9 µs(平均值 ± 标准偏差,7 次运行,1000 个循环 每个)

还有……

data['daily_products'] = data['sum'] - data['sum'].shift(-1)

每个循环 305 µs ± 6.18 µs(平均值 ± 标准偏差,7 次运行,1000 个循环 每个)

【讨论】:

实际上与.diff(-1) 进行比较会更好。不违约时可能会发生一些“摩擦”。 .diff(-1) 提供的负数在我看来是不正确的。但是,它对时代的影响并不大。大概 10 微秒。 谢谢大家。很有帮助【参考方案2】:

要具体解决您的问题,您可以使用.shift

data['daily_products'] = data['sum'] - data['sum'].shift(-1)

或者参考@Scott 的回答,在你的情况下是.diff(-1)


请注意sumpd.DataFrame 的一个方法,这意味着这是一个您不应该使用的保留名称。实际上,为变量使用这样的名称会阻止您通过执行data.sum 来获取它。反对,你可以做data.daily_products,因为这个列名没有进入与pandas的命名空间冲突。 Once it has been defined though.

【讨论】:

以上是关于有没有比在 python 中使用 loc 更快的方法来根据现有数据框填充数据框中的新列?的主要内容,如果未能解决你的问题,请参考以下文章

优化在 pgAdmin 中执行速度比在应用程序中更快的 postgresql 查询以及并发查询

在每次迭代中重新声明变量是不是比在每次迭代后重置它们更快?

为了对存储在 Oracle db 中的数据运行搜索查询,在 PL/SQL 中使用 REGEXP 是不是比在 Java 正则表达式中获取所有数据并过滤它更快?

HTML5 Canvas 在 Firefox 上比在 Chrome 上更快!为啥?

为啥使用第一个阅读器 read() 运行第二个阅读器比在自己的阅读器上运行它运行得更快?

在 GPU 上计算积分图像真的比在 CPU 上更快吗?