【发布时间】: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