具有下一行值的 Python 循环

Posted

技术标签:

【中文标题】具有下一行值的 Python 循环【英文标题】:Python loop with next row values 【发布时间】:2016-12-29 11:29:01 【问题描述】:

有没有办法让我的循环没有错误,因为没有下一个值?或者根本不使用 for 循环?

在下面的这个函数中,我有另一个带有 for 循环的函数:

def funcA(self,perc,bloc):
    def funcA1(self):
        maxIndex = len(self)
        localiz = self.loc
        for x in range(0,maxIndex-1):
            if localiz[x,bloc] == localiz[x+1,bloc]:
                localiz[x,"CALC"] = True
            else:
                localiz[x,"CALC"]= False
        return self

我通过首先使用 False 创建列 "CALC" 来实现它,因为我的 df 的最后一行将始终是 错误。但肯定有更好的方法。

编辑 我基本上使用 pandas 和 numpy 来编写这段代码。

我在函数中使用的 blocID 列 我正在使用的数据结构是这样的:

ID   NUMBER
2    100
2    150
3    500
4    100
4    200
4    250

而预期的结果是:

ID   NUMBER   CALC
2    100      True
2    150      False
3    500      False
4    100      True
4    200      True
4    250      False

【问题讨论】:

缩进有问题:def funcA1(self): 后面没有任何块。 localiz是一个什么样的数据结构? (如何使用localiz[x,"CALC"] 访问元素?) @CodingLambdas:这只是我函数的摘录。 funcA1 嵌套在 funcA 中 @hiroprotagonist: localiz 是我为 DataFrame (df.loc[row_indexer,column_indexer]) 调用 df.loc 的方式 @srWasabi 您的代码仍然无效。冒号后必须增加缩进。 【参考方案1】:

pythonic 方式是这样的:

lst = [char for char in 'abcdef']
print(lst)
for i, (cur, nxt) in enumerate(zip(lst, lst[1:])):
    print(i, cur, nxt)

请注意cur 只会运行到lst 的倒数第二个元素。

这将打印:

['a', 'b', 'c', 'd', 'e', 'f']
0 a b
1 b c
2 c d
3 d e
4 e f

ilstcur 元素的索引。

lst[1:] 创建一个不包括第一个元素的新列表。如果您的列表很长,您可以考虑用islice 替换该部分;这样就不会制作额外的副本。


如果您的 arr 是一个 n 维 numpy 数组,这也适用:

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], np.int32)
print(arr)
for i, (cur, nxt) in enumerate(zip(arr, arr[1:])):
    print(i, cur, nxt)

输出:

[[1 2 3]
 [4 5 6]
 [7 8 9]]
0 [1 2 3] [4 5 6]
1 [4 5 6] [7 8 9]

【讨论】:

它并没有完全回答这个问题,因为@srWasabi 没有使用列表,但可能是字典。 @CodingLambdas:你提到它了:localiz[x,"CALC"] 的语法看起来更像是一个 numpy 数组。哦,不,实际上; "CALC" 不会被接受为索引。那是什么样的数据结构?! 我的猜测是dicttuple 对象作为键,因为a[b, c] 相当于a[(b, c)]。或者它是一个库或@srWasabi 自己构建的数据结构。 我正在为此使用 pandas,'"CALC"' 是我用来检查每组行末尾的数据框列【参考方案2】:

因为我不熟悉 numpy 为我们提供的这种矢量样式的解决方案,所以我认为我无法充分利用给出的建议解决方案。

我确实找到了一种方法来克服我正在使用的循环:

def funcA(self,perc,bloc):
    def new_funcA1(self):

        df = self[[bloc]]
        self['shift'] = df.shift(-1)
        self['CALC'] = self[bloc] == self['shift']
        self.drop('shift', axis=1, inplace=True)
        return self

使用 pandas.DataFrame.shift(-1) 最后一行将返回 NaN。这样我就不必对第一行或最后一行进行任何调整,并且我摆脱了循环!

【讨论】:

以上是关于具有下一行值的 Python 循环的主要内容,如果未能解决你的问题,请参考以下文章

在 JMH 中对具有不同值的循环进行微基准测试

在没有循环的情况下按行计算 pandas 中的余弦相似度

如何在不使用 python 循环的情况下检测和转换列值的单位?

基于条件更改行值的 Python for 循环可以正常工作,但不会更改 pandas 数据帧上的值?

python 循环遍历迭代的前一个,当前值和下一个值的Helper方法

python访问循环内的下一行