我有一个大熊猫系列的日期和累积值,如下所示:
'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
或者我应该手动完成吗?
答案 0 :(得分:5)
您只需拨打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
这是一个更通用的操作,它返回一个移动一个句点的系列(同样默认值是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
最后一个示例显示每行循环的速度有多慢(我使用了双[[]]
强制它返回数据帧,因此我可以传递应用lambda的param axis=1
与前两个被矢量化的方法相比,行方式)。始终寻求矢量化方法以利用明显更快的操作。
所以你可以看到diff
比每行循环快约4000倍,因为它是矢量化的,它比非矢量化方法的扩展要好得多。