0

我正在尝试从具有dirty多种可能性的输入中提取值。

输入是一个具有多种可能类型的系列,例如:"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情况。

谢谢你的想法。

4

2 回答 2

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/except 将它们强制为整数。

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

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

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

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

希望有帮助!

于 2017-07-25T23:45:25.327 回答
0

最后,我用正则表达式确定了一个精心设计的 if/elif 子句。我怀疑嵌套的 try/except 会起作用,但是考虑到 valueError 可能由多种不同的可能性导致,我坚持使用前者。

这是我登陆的内容,为简单起见进行了一些编辑

def get_code(input, logger): # 获取原始输入的整数形式,可以采用以下形式 # an int, float, string (eg 8673341000, 18673341000, "8673341000", # "8673341000'", "8673341000" , "867BBA1000", 8673341000.0, NaN # 如果提供了难以辨认的输入,则返回 "Unknown"

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
于 2017-07-27T22:33:40.113 回答