2017-05-26 40 views
0

我是一名Python初學者,我有一個大型數組要處理,其中一列(loan_status)具有所有條目作爲字符(而不是數字),我想將它們更改爲數字。有不同類型的項目,但基本上我只在「全額支付」和「電流」感興趣,我想將它們轉換爲1個所有其他條目爲0在Python中將字符串轉換爲數字

1 import numpy as np 
2 import pandas as pd 
3 
4 data_file = pd.read_csv('loan.csv') 
5 loan_stat = data_file.loan_status 
6 for i in range(len(loan_stat)): 
7 if loan_stat[i]=='Fully Paid': 
8  loan_stat[i]=1 
9 elif loan_stat[i]=='Current': 
10  loan_stat[i]=1 
11 else: 
12  loan_stat[i]=0 
13 
14 print(loan_stat) 

我得到這樣的錯誤,當我執行「值試圖設置在來自DataFrame的切片副本上」。錯誤指的是第8,10,12行。

非常感謝您的幫助

+0

你試過:'df.loan_stat = df.loan_stat.map({ '繳足':1, '當前':1}' )? –

+0

或'replace'函數? –

+1

請參閱[this](https://stackoverflow.com/a/40214434/6779509)瞭解錯誤。 – parth

回答

0

要做到這一點最簡單的方法,實現一個的if-else對熊貓系列,可能是使用np.where

5 data_file['loan_status'] = np.where(data_file['loan_status'].isin(['Fully Paid', 'Current']), 1, 0) 
6 print(data_file['loan_status']) 

注意,這不包括分配

loan_stat = data_file.loan_status 

假設您想要修改數據幀中的列data_file['loan_status']

如果你不是想用「繳足」 /「當前」狀態指示燈剛好同時避免了SettingWithCopyWarning變量(在@Parth喬杜裏的出色鏈接闡述)一系列獨立,然後

5 loan_stat = np.where(data_file['loan_status'].isin(['Fully Paid', 'Current']), 1, 0) 

會做到這一點。

或者,只是免去您線#5

5 loan_stat = data_file.loan_status.copy() 

也將避免觸發警告的問題,但我不會推薦它,如果僅僅是因爲遍歷一個熊貓系列/數據幀或當你有其他選項時,numpy數組通常會慢很多。

+0

謝謝!我用你的np.where解決方案,它完美的工作,雖然我還是不明白爲什麼我首先在​​我的代碼中得到了錯誤。我會嘗試瞭解@Parth Chaudhary的鏈接。再次感謝你 –

0

您可以創建另一個列表存儲0和1的

import numpy as np 
import pandas as pd 

data_file = pd.read_csv('loan.csv') 
loan_stat = data_file.loan_status 
loan_n=[] 
for i in range(len(loan_stat)): 
    if loan_stat[i]=='Fully Paid': 
     #loan_stat[i]=1 
     loan_n.append(1) 
    elif loan_stat[i]=='Current': 
     #loan_stat[i]=1 
     loan_n.append(1) 
    else: 
     #loan_stat[i]=0 
     loan_n.append(0) 

print(loan_n)