【问题标题】:Simple pandas / numpy 'indexing' in vectorized calcs矢量化计算中的简单熊猫/numpy“索引”
【发布时间】:2014-02-04 23:51:45
【问题描述】:

抱歉,有一个基本问题。我敢肯定答案很简单,但我已经把头撞在墙上一段时间试图弄清楚。我是 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)

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

问题:如何在矢量化操作中有效地引用“偏移”索引?例如,如果我想将 b 中的下一个值与 a (first['a'] > second['b'], first['b'] > second['c'], . ..)?同样,如果我只想在 first['a'] 大于 second['a] 和 second['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]:

(next 和 curr 是 DataFrames。OI 和 Vol 是这些数据帧中的列,而 i 是我的计数器。)我知道这不是 pythonic,而且它也超级慢(这......嗯......可能是为什么它不是pythonic?大声笑)

提前谢谢你。

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

编辑: 感谢 Jaime 和 TomAugspurger 为下面的 np 和 pd 提供答案。明白了……有道理。

后续问题:如何使用不同长度的数据框实现 pandas 移位?想象一下,我有两个重叠的时间序列,但一个在之前延伸,另一个在另一个之后延伸。因此,每个索引中都有不匹配的值,并且索引(几乎可以肯定)是不同的长度。 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

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

【问题讨论】:

    标签: python arrays numpy pandas


    【解决方案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 的第一个元素与任何内容进行比较。

    【讨论】:

    • 好的,谢谢。这在 np 中是有道理的,我明白为什么这是有道理的。 pandas 当然不会允许,因为索引不匹配,但必须有办法。另一个版本的问题是如何在 pandas 中创建一个不同的系列 (t - t-1, t-2 - t-3, ...)。我敢肯定我缺少一个明显的答案。
    • 熊猫的答案是使用shift:first.shift() &gt; secondshift 移动标签。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    • 2016-05-02
    • 2011-10-16
    • 2014-02-16
    相关资源
    最近更新 更多