Нет значения в столбцах строк данных, ошибка в классе - PullRequest
0 голосов
/ 29 августа 2018

Я новичок в python и пытаюсь создать класс python для преобразования и очистки телефонных номеров, столбца данных.

Ошибка появляется, когда я вызываю свой класс, и класс получает значение 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 или байты, подобные объекту

Как я могу сделать мой класс чистым тоже Нет значений? Я имею в виду, не принимать значения для преобразования после

Спасибо всем

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Это происходит, когда self.phone равен None, и вы запускаете re.sub('[^0-9]', '', self.phone) в своем методе __init__. 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
    ...

Но более Pythonic решение было бы потребовать подобный строке объект и вызвать исключение, если это не так. Затем вам нужно разобраться с этими 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"])]

Это будет охватывать __init__ метод. Обратите внимание, что ваш метод valida_telefone требует phone_tratado[:2] для успешного приведения к int. Например, если номер телефона был пустой строкой, это вызвало бы другое исключение.

0 голосов
/ 29 августа 2018

Я только что быстро прочитал вашу проблему, и я думаю, вам, вероятно, следует проверить, является ли значение None перед тестированием if int(self.phone_tratado[:2]) in self.ddd_valido

Так что это будет выглядеть примерно так

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
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...