对不起基本问题。我确定答案很简单,但我已经把头撞到了墙上一段时间试图找出答案。我是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
我想我可以做一个步骤并采用索引联合定义的集合,但这似乎是一个低效的额外步骤。 (我正在努力学习正确的编码实践,而不是简单地让我的项目工作。)有什么想法吗?提前谢谢。
答案 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
的第一个元素与任何内容进行比较。