有没有比在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个环路每个(

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

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

或者cf@Scott的回答,在您使用.diff(-1)的情况下


注意,sumpd.DataFrame的一个方法,这意味着这是一个不应该使用的保留名称。事实上,为变量使用这样的名称会阻止您通过执行data.sum来获得它。相反,您可以执行data.daily_products,因为此列名不会与panda的名称空间冲突一旦定义好

最新更新