Как привести номера телефонов к одному варианту написания?

Есть df c одним столбцом Телефон:

    df.dtypes
    Телефон    object
    dtype: object

Содержит следующие данные:

    Телефон
    (495) 689-53-25
    84951491991
    (903)748-12-92
    +7 (499) 250-69-83
    8(495) 797-55-76

Как привести их к виду: 79995551111?


Ответы (3 шт):

Автор решения: MaxU

Воспользуйтесь методом Series.str.replace():

df["Телефон"] = df["Телефон"].str.replace("\D", "", regex=True)

Пример:

In [182]: df
Out[182]:
              Телефон
0     (495) 689-53-25
1         84951491991
2      (903)748-12-92
3  +7 (499) 250-69-83
4    8(495) 797-55-76

In [183]: df["Телефон"] = df["Телефон"].str.replace("\D", "", regex=True)

In [184]: df
Out[184]:
       Телефон
0   4956895325
1  84951491991
2   9037481292
3  74992506983
4  84957975576
→ Ссылка
Автор решения: eri

Библиотекой phonenumbers можно привести к формату +79123456789

phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.E164)

и можно добавить код страны и исправить '89XX', '9XX', '495'

x = phonenumbers.parse("(495) 689-53-25", "RU")

Вывод

>>> import phonenumbers
>>> x = phonenumbers.parse("(495) 689-53-25", "RU")
>>> x
PhoneNumber(country_code=7, national_number=4956895325, extension=None, italian_leading_zero=None, number_of_leading_zeros=None, country_code_source=0, preferred_domestic_carrier_code=None)
>>> phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.E164)
'+74956895325'
>>> 

Остается только примерить map или transform

→ Ссылка
Автор решения: Namerek

Немного разовью мысль @eri


from phonenumbers import parse, format_number, PhoneNumberFormat

s = [
    '(495) 689-53-25',
    '84951491991',
    '(903)748-12-92',
    '+7 (499) 250-69-83',
    '8(495) 797-55-76',
]

def normalize_number(num: str):
    number = parse(num, "RU")
    return format_number(number, PhoneNumberFormat.E164)

print(*map(normalize_number, s), sep='\n')

# +74956895325
# +74951491991
# +79037481292
# +74992506983
# +74957975576
→ Ссылка