我有一个数据框:
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方式?任何线索都会有所帮助。
答案 0 :(得分:2)
将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])