【问题标题】:pandas DataFrame Dividing a column by itselfpandas DataFrame 自己划分一列
【发布时间】:2012-11-12 23:28:05
【问题描述】:

我有一个用这个填充的熊猫数据框:

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 的主要关注点是部门,而不是转变。到目前为止提供的答案都只针对后者。
  • 我担心的是除法,但我得到这个结果的原因是熊猫对齐。 Shift 解决了这个问题。
  • 好的,很高兴你成功了!

标签: python dataframe pandas


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您希望在列和滞后值之间进行运算,您应该执行test.Open / test.Open.shift() 之类的操作。 shift 重新排列数据并采用可选数量的句点。

    【讨论】:

    • 啊,轮班是我需要的。我用 .values 解决了这个问题,但这是我更愿意这样做的方式。谢谢!
    猜你喜欢
    • 2020-08-02
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多