具有下一行值的Python循环

时间:2016-12-29 11:29:02

标签: python-3.x for-loop

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

在下面的这个函数中,我有另一个带有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代码。

我在该功能中使用的 bloc ID 列 我正在使用的数据结构是这样的:

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

2 个答案:

答案 0 :(得分: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

ilst元素的cur中的索引。

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)

with ouput:

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

答案 1 :(得分:1)

因为我不熟悉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。这样我就不必对第一行或最后一行进行任何调整,我摆脱了循环!