pandas DataFrame 将一列除以自身

3

我有一个pandas数据框,我填充了以下内容:

import pandas.io.data as web
test = web.get_data_yahoo('QQQ')

数据框在iPython中的显示如下:
In [13]:  test
Out[13]:
    <class 'pandas.core.frame.DataFrame'>
    DatetimeIndex: 729 entries, 2010-01-04 00:00:00 to 2012-11-23 00:00:00
    Data columns:
    Open         729  non-null values
    High         729  non-null values
    Low          729  non-null values
    Close        729  non-null values
    Volume       729  non-null values
    Adj Close    729  non-null values
    dtypes: float64(5), int64(1)

当我将一列除以另一列时,得到的是一个float64结果,其小数位数令人满意。我甚至可以将一列除以另一列偏移一定量,例如test.Open[1:]/test.Close[:],并获得令人满意的小数位数。然而,当我将一列除以自身偏移时,只得到1:
In [83]: test.Open[1:] / test.Close[:]
Out[83]:

    Date
    2010-01-04         NaN
    2010-01-05    0.999354
    2010-01-06    1.005635
    2010-01-07    1.000866
    2010-01-08    0.989689
    2010-01-11    1.005393
...
In [84]: test.Open[1:] / test.Open[:]
Out[84]:
    Date
    2010-01-04   NaN
    2010-01-05     1
    2010-01-06     1
    2010-01-07     1
    2010-01-08     1
    2010-01-11     1

我可能漏掉了一些简单的东西。要从这样的计算中获得有用的值,我需要做什么?感谢您提前提供的帮助。


我认为OP的主要关注点在于除法,而不是移位。到目前为止提供的答案都只涉及后者。 - Aman
我的关注点在于除法,但我得到这个结果的原因是由于 pandas 对齐。使用 Shift 可以解决这个问题。 - Brad Fair
好的,很高兴你已经解决了它! - Aman
2个回答

5
如果您想在列和滞后值之间进行操作,应该像这样做:test.Open / test.Open.shift()shift 重新对齐数据并采取可选的周期数。

啊,移位正是我所需要的。我用.values解决了它,但这是我更喜欢的方法。谢谢! - Brad Fair

0

当你执行test.Open[1:]/test.Close时,你可能没有得到你想要的结果。Pandas会根据它们的索引匹配行,因此你仍然会得到每个列的每个元素除以另一个列中对应的元素(而不是前一行的元素)。以下是一个例子:

>>> print d
   A  B   C
0  1  3   7
1 -2  1   6
2  8  6   9
3  1 -5  11
4 -4 -2   0
>>> d.A / d.B
0    0.333333
1   -2.000000
2    1.333333
3   -0.200000
4    2.000000
>>> d.A[1:] / d.B
0         NaN
1   -2.000000
2    1.333333
3   -0.200000
4    2.000000

请注意,两个操作返回的值是相同的。第二个操作只是在第一个操作数中没有对应值时使用了nan
如果您真的想要在偏移行上进行操作,您需要深入挖掘支撑 pandas DataFrame 的 numpy 数组,以绕过 pandas 的索引对齐功能。您可以通过列的values属性访问这些内部数据。
>>> d.A.values[1:] / d.B.values[:-1]
array([-0.66666667,  8.        ,  0.16666667,  0.8       ])

现在你真的正在获取每个值除以其前面的值在另一列中。请注意,在这里,您必须显式地切片第二个操作数以省略最后一个元素,以使它们长度相等。

因此,您可以执行相同的操作将一列除以其偏移版本:

>>> d.A.values[1:] / d.A.values[:-1]
45: array([-2.   , -4.   ,  0.125, -4.   ])

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