通过遍历熊猫中的连续行来创建新列

时间:2018-08-16 15:17:07

标签: python pandas

我有一个数据框:

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或任何pythonic方式?任何线索都会有所帮助。

1 个答案:

答案 0 :(得分:2)

np.whereshift一起使用

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])