Python、Pandas。从累积值转换为增量

Python, Pandas. Converting from cumulative values to deltas

我有一个 pandas 系列的日期和累积值,如下所示:

'2015-01-01': 1
'2015-01-02': 3
'2015-01-03': 7
'2015-01-04': 8

我可以使用 pandas 像这样将它们转换为 "deltas" 吗?

'2015-01-01': 0   
'2015-01-02': 2
'2015-01-03': 4
'2015-01-04': 1

还是我应该手动完成?

直接调用diff即可,默认周期为1:

In [21]:

df['diff'] = df['Cumulative_Value'].diff()
df
Out[21]:
       Dates  Cumulative_Value  diff
0 2015-01-01                 1   NaN
1 2015-01-02                 3     2
2 2015-01-03                 7     4
3 2015-01-04                 8     1

您还可以使用 shift,这是一个更通用的操作,即 returns 一个系列移动一个句点(同样默认为 1),在这种情况下,尽管在这个大小的数据集上它较慢:

In [25]:

%timeit df['Cumulative_Value'].diff()
%timeit df['Cumulative_Value'] - df['Cumulative_Value'].shift()
%timeit df[['Cumulative_Value']].apply(lambda x: x - x.shift(), axis=1)
10000 loops, best of 3: 109 µs per loop
1000 loops, best of 3: 330 µs per loop
100 loops, best of 3: 4.02 ms per loop

最后一个例子显示了在每一行上循环有多慢(我使用了双 [[]] 强制它到 return 一个数据帧,所以我可以传递参数 axis=1与向量化的前两种方法相比,它逐行应用 lambda 函数。始终寻求一种矢量化方法来利用明显更快的操作。

所以你可以在这里看到 diff 比在每一行上循环快 4000 倍,因为它是矢量化的,它将比非矢量化方法更好地扩展。