矢量化计算中的简单pandas / numpy'索引'

时间:2014-02-04 23:51:46

标签: python arrays numpy pandas

对不起基本问题。我确定答案很简单,但我已经把头撞到了墙上一段时间试图找出答案。我是python的新手,但我理解向量化计算的概念。例如,在以下(非常简单的)代码中:

import pandas as pd

ndx = ['a', 'b', 'c', 'd', 'e', 'f']
first = [3, 7, 2, 5, 9, 4]
second = [8, 9, 7, 3, 3, 7]

first = pd.DataFrame(first, index = ndx)
second = pd.DataFrame(second, index = ndx)

我知道第一个> second将返回一个布尔数组,其中a中的每个元素都大于b中的对应元素,匹配索引。我知道这种严格的索引匹配是使用pandas的好处之一,但是......

问题:如何在向量化操作中有效地引用“偏移”索引?例如,如果我想将b中的下一个值与a(first ['a']> second ['b']中的当前值进行比较,首先['b']> second ['c'] ,...)?同样,如果我想在第一个['a']大于第二个['a]和第二个['b']时返回True,该怎么办?

我编写了一些代码来完成这样的事情,通过索引遍历数组。这是一个例子:

        if next.at[curr.index[i], 'OI'] > curr.OI[i] and \
        next.at[curr.index[i+1], 'OI'] > curr.OI[i+1] and \
        next.at[curr.index[i], 'Vol'] > curr.Vol[i] and \
        next.at[curr.index[i+1], 'Vol'] > curr.Vol[i+1]:

(接下来和curr是DataFrames.OI和Vol是那些数据帧中的列,我是我的计数器。)我知道这不是pythonic而且它也非常慢(嗯...可能是为什么它不是pythonic?lol)

提前谢谢。

总结:一般问题是如何在pandas(和numpy)中引用偏移元素。

编辑: 感谢Jaime和TomAugspurger提供下面np和pd的答案。得到它......有道理。

后续问题:如何使用不同长度的数据帧实现pandas shift?想象一下,我有两个时间序列重叠,但一个延伸到另一个,另一个延伸到另一个。因此每个索引中都有不匹配的值,并且索引(几乎可以肯定)是不同的长度。 pandas不会允许shift()出现此错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-15-35914edbe0ff> in <module>()
----> 1 aa = q['OI'] > r['OI']

C:\Python27\lib\site-packages\pandas\core\ops.pyc in wrapper(self, other)
    540             name = _maybe_match_name(self, other)
    541             if len(self) != len(other):
--> 542                 raise ValueError('Series lengths must match to compare')
    543             return self._constructor(na_op(self.values, other.values),
    544                                      index=self.index, name=name)

ValueError: Series lengths must match to compare

我想我可以做一个步骤并采用索引联合定义的集合,但这似乎是一个低效的额外步骤。 (我正在努力学习正确的编码实践,而不是简单地让我的项目工作。)有什么想法吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

不确定pandas,但是在numpy中你通过比较偏移切片来做这类事情。通过“将下一个值与当前值进行比较”的示例,您可以执行以下操作:

>>> first = np.array([3, 7, 2, 5, 9, 4])
>>> second = np.array([8, 9, 7, 3, 3, 7])
>>> first[:-1] > second[1:]
array([False, False, False,  True,  True], dtype=bool)

切片显然不会将first的最后一个元素或second的第一个元素与任何内容进行比较。