Python 字符串的dataframe列中无值,类中有错误

Python 字符串的dataframe列中无值,类中有错误,python,pandas,class,oop,Python,Pandas,Class,Oop,我是python新手,我正在尝试使用python类来转换和清理电话号码、数据帧列 当我调用我的类并且该类从dataframe行接收到none值时,会出现错误 我的班级 class Tel(object): '''Classe que invalida telefones não válidos''' def __init__(self, phone): self.phone = phone self.phone_tratado = self.ph

我是python新手,我正在尝试使用python类来转换和清理电话号码、数据帧列

当我调用我的类并且该类从dataframe行接收到none值时,会出现错误

我的班级

class Tel(object):
    '''Classe que invalida telefones não válidos'''

    def __init__(self, phone):
        self.phone = phone
        self.phone_tratado = self.phone = re.sub('[^0-9]', '', self.phone)
        self.ddd_valido = [11, 12, 13, 14, 15, 16, 17, 18, 19,
                          21, 22, 24, 27, 28,
                          31, 32, 33, 34, 35, 37, 38,
                          41, 42, 43, 44, 45, 46, 47, 48, 49,
                          51, 53, 54, 55,
                          61, 62, 63, 64, 65, 66, 67, 68, 69,
                          71, 73, 74, 75, 77, 79,
                          81, 82, 83, 84, 85, 86, 87, 88, 89,
                          91, 92, 93, 94, 95, 96, 97, 98, 99]


    def valida_telefone(self):

        if int(self.phone_tratado[:2]) in self.ddd_valido:
            # ddd valido
            if self.phone_tratado is None: # nulo
                return None

            if len(self.phone_tratado) == 10:
                if self.phone_tratado[2] in ['0', '1']: #fixoinvalido
                    return None
                if self.phone_tratado[2] in ['2', '3', '4', '5']:#fixo valido
                    return self.phone_tratado
                else:# celular, ajustar
                    return self.phone_tratado[:2] + '9' + self.phone_tratado[2:]
            elif len(self.phone_tratado) == 11: #celular
                if self.phone_tratado[2] == '9' and self.phone_tratado[3] in ['6', '7', '8', '9']:# celular valido
                    return self.phone_tratado
                else:
                    return None
            else:# qtde invalida
                return None
        else:# ddd invalido
            return None

My example Dataframe: NR_T
## +-------+------+
## |INDEX  |NR_TEL|
## +-------+------+
## |10     | 1    |
## |1      | 2    |
## |7      | None |
## +-------+------+
我的电话:

Tel(df_2.loc[10,'NR_TEL']).valida_telefone()
工作正常

Tel(df_2.loc[7,'NR_TEL']).valida_telefone()
错误:应为Atring或类似字节的对象

我怎样才能完成我的课程呢?我的意思是,没有要转换的值


谢谢大家

我刚刚快速阅读了您的问题,我认为您应该在测试self.ddd\u valido中的
if int(self.phone\u tratado[:2])之前测试该值是否为
None

看起来是这样的

def valida_telefone(self):
    if self.phone_tratado is None: # nulo
            return None
    else:

        if int(self.phone_tratado[:2]) in self.ddd_valido:
            # ddd valido
        ...

self.phone
None
,并且您在
\uu init\uu
方法中运行
re.sub(“[^0-9]”,'',self.phone)
时,就会发生这种情况
re.sub
需要类似字符串的对象,而不是
None

一个选项是为
self.phone
提供默认值,例如:

def __init__(self, phone):
    if phone is None:
        # use "0" or some other default value
        phone = "0" 
    self.phone = phone
    ...
但一个更具python风格的解决方案是需要一个类似字符串的对象,如果不是,则引发一个异常。然后,在使用类之前,您需要处理那些
None
值:

def __init__(self, phone):
    if isinstance(phone, str):
    # or use, if Python 2.x:
    # if isinstance(phone, basestring):
        raise Exception("Phone number must be a string")
    self.phone = phone
    ...
然后分别处理
None
,例如,将它们过滤掉:

df_2_notnull = df_2[pd.notnull(df_2["NR_TEL"])]
这将只涉及
\uuuu init\uuuu
方法。请注意,您的
valida_telefone
方法需要
phone_tratado[:2]
才能成功转换为
int
。例如,如果电话号码是空字符串,则会引发另一个异常