如何使用python apply / lambda / shift函数基于2列的值获取该特定列的上一行值?

时间:2019-02-18 09:35:34

标签: python pandas dataframe

我有2列(FN1和FN2),因此我必须再创建一列(最终)

FN1     FN2    Final
False   False   1
True    True    1
False   False   1
True    False   2
True    True    2
False   False   1 
True    True    1
True    True    1
  • 如果FN1为False,则最终值为1。

  • 如果FN2为True,则我将为Final的先前值。

  • 但是,如果FN2为False,则需要使用之前的值进行更新 最终+1(即递增1)

。我尝试使用shift()来做到这一点,但在这种情况下又无济于事。

FN1     FN2    Final
False   False   1
True    True    1
False   False   1
True    False   2
True    True    2
False   False   1 
True    True    1
True    True    1

2 个答案:

答案 0 :(得分:1)

使用np.select

df1 = df.shift()

cond1 = df['FN1'] == False
cond2 = (df['FN1']==True) & (df['FN2'] ==True)
cond3 = (df['FN1']==True) & (df['FN2'] == False)

df['Final'] = np.select([cond1,cond2,cond3], [1, df1['Final'], df1['Final']+1])

print(df)

答案 1 :(得分:0)

使用lambda:

df = pd.DataFrame({'FN1': [False, True, False, True, True, False, True, True],
                   'FN2': [False, True, False, False, True, False, True, True]
                   })

def f(fn1, fn2):
    global previousfinal
    previousfinal = 1 if not fn1 else previousfinal + 1 if not fn2 else previousfinal
    return previousfinal

previousfinal = 1
df['Final'] = df[['FN1', 'FN2']].apply(lambda x: f(*x), axis=1)
print(df)