【问题标题】:Python, Pandas. Converting from cumulative values to deltas蟒蛇,熊猫。从累积值转换为增量
【发布时间】:2015-03-23 15:49:05
【问题描述】:

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

'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

还是我应该手动完成?

【问题讨论】:

  • 日期是您系列的索引还是它们也是值? IE。是系列中的第一个值"'2015-01-01': 1" 还是简单的1
  • 日期是索引。

标签: python pandas time-series


【解决方案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,这是一个更通用的操作,它返回一个按句点移动的系列(同样默认值为 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

最后一个示例显示了在每一行上循环的速度有多慢(我使用了双精度 [[]] 来强制它返回一个数据帧,因此我可以传递参数 axis=1,它按行应用 lambda 函数)比较到矢量化的前两种方法。始终寻求矢量化方法以利用显着更快的操作。

因此您可以在此处看到 diff 比在每一行上循环快约 4000 倍,因为它是矢量化的,它的缩放比非矢量化方法要好得多。

【讨论】:

猜你喜欢
  • 2022-08-22
  • 2021-11-09
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
相关资源
最近更新 更多