2017-05-26 65 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)