2017-07-25 118 views
0

我想从输入中提取一个值为dirty的数值,并有很多可能性。如何处理多种不同类型的值Python/Pandas中的错误结果?

输入的是,有许多可能的类型示例的系列:"8673331000", "8673331000'", 8673331000, 18673331000, 8673331000.0, NaN, "867B331000"

在第5例,我找867333,在int格式。最后两种情况我想报告Unknown或类似的情况。

我一直在使用try/except,但是有一些不同类型的ValueError报告过。

现在我使用:

*try: 
    val = int(number) 
except ValueError as ve: 
    if (number[len(number)-1]=="'"): 
     val = int(number[0:len(number)-2]) 
    else: 
     val = int(float(number))* 

except条款处理,其中输入了一个单引号,但不处理NaN案件的情况。

感谢您的想法。

+0

你是说,你想添加另一个异常的'except'子句?你可以通过添加另一个'except'子句来做到这一点,就像'ValueError'那样。 –

+0

或者您可以在'try'stmt中添加'else'子句,请参阅[here](http://amir.rachum.com/blog/2012/07/24/what-else-is-there-in-蟒蛇/) – patrick

回答

0

如果输入已经是熊猫系列,您可以使用pandas.to_numeric(your_series_data, errors='coerce').fillna(-9999).astype(int)

import pandas as pd 
from io import StringIO 

# some example data 
data=StringIO('''Values 
,8673331000 
,8673331000 
,8673331000 
,18673331000 
,8673331000.0 
,NaN 
,867B331000 
''') 

#read data to csv 
df = pd.read_csv(data, sep=",") 

# your data may already be a pandas series, which below is df.iloc[:,0] 
pd.to_numeric(df.iloc[:,0],errors='coerce').fillna(-9999).astype(int) 

NaN  8673331000 
NaN  8673331000 
NaN  8673331000 
NaN 18673331000 
NaN  8673331000 
NaN   -9999 
NaN   -9999 
Name: Values, dtype: int64 

您可以使用此系列直接的价值,而无需使用try /除了强迫他们为整数。

整数在熊猫中不能表示为NaN,所以在本例中它们被替换为-9999。当您从系列中提取值时,如果它与-9999匹配,则可以将其设置为无或您的代码应该具有缺失值的任何值。

如果您的输入值是字符串,它们可能会被强制转换为NaN而不是整数,例如,

data=StringIO('''Values 
,8673331000 
,"8673331000" 
,\'8673331000\' 
,18673331000 
,8673331000.0 
,NaN 
,867B331000 
''') 
df = pd.read_csv(data, sep=",") 

使用pd.to_numeric(df.iloc[:,0], errors='coerce').fillna(-9999).astype(int)时,在这种情况下,第三值将最终成为NaN的,我建议只删除从您的输入数据

希望帮助!

0

最终所有“或”我我怀疑嵌套尝试/除了会工作,但考虑到valueError可能会导致一些不同的可能性,我坚持与前者。

这是我登陆上,与一些为了简化编辑

DEF GET_CODE(输入,记录器): #抓起原始输入的整数形式,可以进来的 #的整数,浮点,字符串的形式(例如8673341000,18673341000, “8673341000”, # “8673341000' ”, “8673341000”, “867BBA1000”,8673341000.0,NaN的 #返回 “未知” 如果字迹模糊输入提供

import re 
import math 
import numpy as np 

val = "Unknown" 

if (type(input)==int): 
    val = input 

elif(type(input)==float): 
    #could be NaN or a float (e.g. 100.0, but not 1.0e+10) 
    try: 
     val= int(input) 
    except: 
     val="Unknown" 

elif(type(input)==str): 
    if (input[len(input)-1]=="'"): 
     val = int(input[0:len(input)-1]) 
    elif (re.match('^[0-9]+$', input)): 
     #input contains only digits 
     val = int(input) 
    elif ((re.match('\s+\d+\s+', input)) or (re.match('\s+\d+', input)) or (re.match('\d+\s+', input))): 
     #leading or trailing spaces 
     input = input.strip() 
     val=int(input) 
    else: 
     return "Unknown" 
elif(type(np.float64(input).item())==float): 
    #Input is of the form 1.416441e+10 

    val = int(input) 


else: 
    logger.warning("Unknown Input type for get_NPANXX() ... input:" , input) 
    logger.warning(type(input)) 
    return val #E.g. "Unknown Input" 

#...more processing once val is in integer form 
return 
相关问题