2017-08-28 42 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

相關問題