簡體   English   中英

帶有下一行值的Python循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM