pandas DataFrame将一列单独分隔



我有一个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结果,它有令人满意的小数位数。我甚至可以将一列除以另一列,偏移量为1,例如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

我可能错过了一些简单的东西。我需要做什么才能从这种计算中获得有用的值?提前感谢您的协助。

如果要在列和滞后值之间执行操作,则应该执行类似test.Open / test.Open.shift()的操作。shift重新排列数据并采用可选数量的周期。

当您执行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.   ])

最新更新