我有一个数据框架,其中包括工厂每天生产的产品总数,但它是一个累积字段,而不是每日值。我正试图通过从第二天的数字中减去每天的累计数字来计算每日数值。这是我正在使用的代码。我使用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)
的情况下
注意,sum
是pd.DataFrame
的一个方法,这意味着这是一个不应该使用的保留名称。事实上,为变量使用这样的名称会阻止您通过执行data.sum
来获得它。相反,您可以执行data.daily_products
,因为此列名不会与panda的名称空间冲突一旦定义好。