[英]Python loop with next row values
有没有一种方法可以使我的循环正常工作,因为没有下一个值? 还是根本不使用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的最后一行始终为False 。 但是肯定有更好的方法。
编辑我基本上是使用pandas和numpy作为此代码。
我使用在功能上是集团的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
一个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
i
是在索引lst
所述的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)
输出:
[[1 2 3]
[4 5 6]
[7 8 9]]
0 [1 2 3] [4 5 6]
1 [4 5 6] [7 8 9]
因为我不熟悉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。 这样,我不必对第一行或最后一行进行任何调整,并且摆脱了循环!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.