Pandas将一列数据除以滞后值

4

我正在尝试将Pandas DataFrame列除以滞后值,在此示例中为1。

创建数据帧。虽然我的实际数据有数十个列,但此示例仅有1个列。

dTest = pd.DataFrame(data={'Open': [0.99355, 0.99398, 0.99534, 0.99419]})

当我尝试进行向量除法时(我是从R转来的Python新手):
dTest.ix[range(1,4),'Open'] / dTest.ix[range(0,3),'Open']

我得到了这个输出:
NaN 1 1 NaN
但我期望的是:
1.0004327915052085 1.0013682367854484 0.9988446159101413
显然,我对数据结构有所误解。我期望三个值,但它输出了四个。我错过了什么?
1个回答

1
你尝试的方法失败了,因为索引的切片范围仅在中间2行重叠。你应该使用shift来移动行以实现你想要的效果:
In [166]:
dTest['Open'] / dTest['Open'].shift()

Out[166]:
0         NaN
1    1.000433
2    1.001368
3    0.998845
Name: Open, dtype: float64

您也可以使用 div 标签:
In [159]:
dTest['Open'].div(dTest['Open'].shift(), axis=0)

Out[159]:
0         NaN
1    1.000433
2    1.001368
3    0.998845
Name: Open, dtype: float64

当您进行切片操作时,可以看到索引是不同的,因此在使用/时,只有共同索引会受到影响:

In [164]:
dTest.ix[range(0,3),'Open']

Out[164]:
0    0.99355
1    0.99398
2    0.99534
Name: Open, dtype: float64

In [165]:
dTest.ix[range(1,4),'Open']

Out[165]:
1    0.99398
2    0.99534
3    0.99419
Name: Open, dtype: float64

这里:
In [168]: 

dTest.ix[range(0,3),'Open'].index.intersection(dTest.ix[range(1,4),'Open'].index

Out[168]:
Int64Index([1, 2], dtype='int64')

我不明白关于 / 的那一部分。div/ 在索引方面的行为完全相同,不是吗? - DSM
@DSM 我应该提到使用shift可以移动索引来帮助对齐。 - EdChum
感谢您的快速回复。一个小注释是解决方案中的顺序是相反的。我寻求的输出是dTest ['Open'] .shift(-1)/ dTest ['Open']。 - Shaun Overton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接