2017-08-28 18 views
-1

我有贷款数据与借款人身份证,银行身份证,到期日和贷款支付日期。我想查明,对于任何借款人而言,她之前的贷款是否尚未到期,目前的贷款是否已发放(多笔借款)。如果是这样,我想创建一个包含银行标识的列,以前的未到期贷款已经从中取出。如果基于前一行的条件产生“一个Series的真值不明确,请使用a.empty,a.bool(),a.item(),a.any()或a.all()。”

我的数据看起来像

df = pd.DataFrame({'month':[3,6,7,12,2,5,8,1], 
       'borrower':[1,1,1,1,2,2,3,4], 
       'bank':[1,1,2,3,3,3,4,5], 
       'maturity':[9,18,19,24,14,17,14,13]}) 

我想补充这一个列:

df = pd.DataFrame({'month':[3,6,7,12,2,5,8,1], 
       'borrower':[1,1,1,1,2,2,3,4], 
       'bank':[1,1,2,3,3,3,4,5], 
       'maturity':[9,18,19,24,14,17,14,13], 
       'currently_borrowing':[np.nan,1,1,2,np.nan,3,np.nan,np.nan]}) 

我曾尝试下面的代码:

df = df.sort_values(['borrower','month']) 
if ((df['bank'] == df['bank'].shift()) & (df['maturity'] >= df['maturity'].shift()) &(df['maturity'].shift() > df['month'])) : 
    df['currently_borrowing'] = df['bank'].shift() 
else : 
    df['currently_borrowing'] = np.nan 

,但我得到的以下错误消息:“一个Series的真值不明确,使用a.empty,a.bool(),a.item(),a.any()或a.all()。” 我曾尝试添加.any()和.all(),但新列只包含NAN。

任何帮助非常感谢!

回答

0

IIUC,您可以创建一个面具,使用np.where

print(df) 

    bank borrower maturity month 
0  1   1   9  3 
1  1   1  18  6 
2  2   1  19  7 
3  3   1  24  12 
4  3   2  14  2 
5  3   2  17  5 
6  4   3  14  8 
7  5   4  13  1 

df = df.sort_values(['borrower','month']) 

mask = ((df['borrower'] == df['borrower'].shift()) 
     & (df['maturity'] >= df['maturity'].shift()) 
     & (df['maturity'].shift() > df['month'])) 

df['current borrow'] = np.where(mask, df.bank.shift(), np.nan) 

print(df) 

    bank borrower maturity month currentborrow 
0  1   1   9  3   NaN 
1  1   1  18  6   1.0 
2  2   1  19  7   1.0 
3  3   1  24  12   2.0 
4  3   2  14  2   NaN 
5  3   2  17  5   3.0 
6  4   3  14  8   NaN 
7  5   4  13  1   NaN 

你的误解if...else适用性 - 它的工作原理与标值,而不是pd.Series。这就是为什么np.where更适合这里。

另外,你的面具逻辑有问题。第一个条件应该在borrower上完成,而不是bank

相关问题