Как заменить и добавить определенные числа в строку в Pandas DataFrame?

В настоящее время я пытаюсь очистить столбец данных, содержащий номера телефонов пользователей. Телефонные номера не соответствуют своему формату и должны быть стандартизированы.

Например:

import pandas as pd

data = {'Name': ['John', 'Dom', 'Jack', 'Sam', 'Fred', 'Harvey', 'Toby'],
        'Phone': ['+49(0) 047905356', '(0161) 496 0674', '239.711.3836', '02984 08192', 
        '(0306) 999 0871', '0121x496x0225', '+44047905356']}

df = pd.DataFrame(data)

Теперь я попытался использовать следующий код для удаления специальных символов:

df['Phone'] = df['Phone'].replace('\W','', regex=True)

Это работает, однако я хочу заменить числа, которые содержат только знак +, за которым следует код с «0», чтобы добиться следующего:

Пример ожидаемых результатов:

Вход: '+49(0) 047905356' | Ожидается: '047905356'

Ввод: '+44047905356'| Ожидается: '047905356'

Но тогда я также хочу, чтобы числа без «0» в начале включали единицу, например:

Вход: '239.711.3836' | Ожидается: '02397113836'

Пожалуйста, можете ли вы предоставить полный ожидаемый результат?

Corralien 21.02.2023 22:16

Для вашего второго примера, как вы должны знать, чтобы отделить 44 от 047905356?

Michael Cao 21.02.2023 22:17
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
Learning Data Analytics Two: Filtering data in a DataFrame.
Learning Data Analytics Two: Filtering data in a DataFrame.
В Learning Data Analytics One: Using Python and Pandas , я рассказываю о:
0
2
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы хотите, чтобы в столбце «Телефон» были только цифры, вы можете использовать регулярное выражение [^0-9].

Вы можете узнать, начинается ли строка с 0, используя str.startswith()

df['Phone'] = df['Phone'].replace('[^0-9]','', regex=True)

df['start_with_0'] = df.Phone.str.startswith("0")
df['needs_0'] = df.start_with_0.replace({True:"", False:"0"})
df['Phone_new'] =  df.needs_0 + df.Phone
df
Ответ принят как подходящий

Вы можете использовать регулярное выражение для достижения желаемого результата.

import re

import pandas as pd 
data = {'Name': ['John', 'Dom', 'Jack', 'Sam', 'Fred', 'Harvey', 'Toby'],
'Phone': ['+49(0) 047905356', '(0161) 496 0674', '239.711.3836', '02984 08192',
'(0306) 999 0871', '0121x496x0225', '+44047905356']}
df = pd.DataFrame(data)

data = {'Name': ['John', 'Dom', 'Jack', 'Sam', 'Fred', 'Harvey', 'Toby'],
        'Phone': ['+49(0) 047905356', '(0161) 496 0674', '239.711.3836', '02984 08192', 
        '(0306) 999 0871', '0121x496x0225', '+44047905356']}
df['Phone'] = df['Phone'].replace('\D', '', regex=True)

df.loc[df['Phone'].str.startswith('+'), 'Phone'] = '0' + df['Phone'].str[1:]

df.loc[~df['Phone'].str.startswith('0'), 'Phone'] = '0' + df['Phone']

df['Phone'] = df['Phone'].str[:2] + '.' + df['Phone'].str[2:4] + '.' + df['Phone'].str[4:]

Выход:

     Name            Phone
0    John  04.90.047905356
1     Dom    01.61.4960674
2    Jack    02.39.7113836
3     Sam     02.98.408192
4    Fred    03.06.9990871
5  Harvey    01.21.4960225
6    Toby   04.40.47905356

Другие вопросы по теме