python - 有没有比在 python 中使用 loc 更快的方法来根据现有数据框填充数据框中的新列?
问题描述
我有一个数据框,其中包括工厂每天生产的产品总数,但它是一个累积字段,而不是每日值。我试图通过从第二天的数字中减去每天的累积数字来计算每日值。这是我正在使用的代码。我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'].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 个循环)
推荐阅读
- python - 如何将纪元时间转换为另一种格式并将其保存到 Python 中的 csv 文件中?
- node.js - 如何在没有 viewId 的情况下查询 Google Analytics
- azure - Azure 应用程序代理不接受授权标头
- c++ - 将数组元素传递给模板
- nestjs - NestJS(7.5.1)不在观看模式下观看资产
- python - Paramiko stdout.read 给出“AttributeError:'tuple'对象没有属性'read'”
- database - 检测 oracle UDT 列
- regex - groovy:一次性过滤和提取子字符串
- python - 为什么在我只尝试分配变量时执行操作?
- api - 调试后清理数据库中的对象