gpt4 book ai didi

python - 矢量化计算中的简单 pandas/numpy 'indexing'

转载 作者:行者123 更新时间:2023-11-28 18:45:04 24 4
gpt4 key购买 nike

很抱歉问一个基本问题。我敢肯定答案很简单,但我已经用头撞墙了一段时间试图找出答案。我是 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 将返回一个 bool 数组 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 是数据帧。OI 和 Vol 是这些数据帧中的列,i 是我的计数器。)我知道这不是 pythonic,而且它也非常慢(这......嗯......可能是它不是的原因pythonic?哈哈)

提前谢谢你。

总结:一般问题是如何在 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

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

最佳答案

不确定 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 的第一个元素与任何内容进行比较。

关于python - 矢量化计算中的简单 pandas/numpy 'indexing',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21566012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com