Создайте новый столбец на основе итераций по последовательным строкам в пандах

У меня есть фреймворк:

import pandas as pd
import numpy as np
df = pd.DataFrame({'a':[1,20,3,4,50,6],
               'b':[12,43,78,23,14,28],
               'c': [100,200,300,400,500,600]})`

Я хочу перебирать последовательные строки так, чтобы

если значение 'a' следующей строки - значение 'a' текущей строки равно менее 10,

а затем проверьте, является ли значение 'c' следующей строки -'b' текущей строки менее 400

return 0

else return Nan.

Я хотел сделать это с помощью .apply, написал для этого код.

def query(row,df):
    try:
        i = row.name
        curr = df.iloc[i]
        curr_a = curr['a']
        next = df.iloc[i+1]
       next_a = next['a']
        if (next_a-curr_a) < 10:
            print(next_a,curr_a)
            curr_b = curr['b']
            next_c = next['c']
            print(next_c,curr_b)
           if (next_c - curr_b) < 400:
                return 0
        else:
            diff = np.nan
        return diff
    except:
        pass

df['new_col'] = df.apply(lambda x: query(x,df),axis=1)

В основном я беру индекс текущей строки, то есть i, и передаю его функции, в которой я нахожу текущую строку с помощью df.iloc[i]. и следующую строку с помощью df.iloc[i+1], а затем проверку условий. Но я не думаю, что это лучший способ сделать это.

Есть лучший способ это сделать? Может быть, использовать .shift или любой питонический способ? Любые зацепки будут полезны.

🤔 А знаете ли вы, что...
Python используется в научных вычислениях и обработке изображений с использованием библиотеки OpenCV.


54
1

Ответ:

Решено

Использование np.where с shift

np.where(((df.a.shift(-1)-df.a)<10)&((df.c.shift(-1)-df.b)<400),0,np.NaN)
Out[85]: array([nan,  0.,  0., nan, nan, nan])