有没有比在 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)
请注意sum
是pd.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 上更快!为啥?