у меня есть датафрейм
>temp
Age Rank PhoneNumber State City
10 1 99-22344-1 Ga abc
15 12 No Ma xyz
Для столбца (номер телефона) я хочу удалить все символы, например - если они не являются полными телефонными номерами, и если в нем указано «Нет» или любое слово, кроме числа, я хочу, чтобы это было пустым. Как я могу это сделать
Моя попытка может обрабатывать специальные символы, но не символы слов, такие как «Нет».
temp['PhoneNumber '] = temp['PhoneNumber '].str.replace('[^\d]+', '')
Желаемый результат df -
>temp
Age Rank PhoneNumber State City
10 1 99223441 Ga abc
15 12 Ma xyz
Только столбец с номером телефона
@TimRoberts я отредактировал свой вопрос. Спасибо. Кстати, ты выглядишь очень знакомо.
Это делает работу.
import pandas as pd
import re
data = [
[10, 1, '99-223344-1', 'GA', 'Abc'],
[15, 12, "No", 'MA', 'Xyz']
]
df = pd.DataFrame(data, columns=['Age Rank PhoneNumber State City'.split()])
print(df)
def valphone(p):
p = p['PhoneNumber']
if re.match(r'[123456789-]+$', p):
return p
else:
return ""
print(df['PhoneNumber'])
df['PhoneNumber'] = df['PhoneNumber'].apply(valphone, axis=1)
print(df)
Выход:
Age Rank PhoneNumber State City
0 10 1 99-223344-1 GA Abc
1 15 12 No MA Xyz
Age Rank PhoneNumber State City
0 10 1 99-223344-1 GA Abc
1 15 12 MA Xyz
Я должен признать, что немного разочарован этим. Я ОЖИДАЛ, что смогу сделать
df['PhoneNumber'] = df['PhoneNumber'].apply(valphone)
потому что df['PhoneNumber']
должен возвращать серию, а функция Series.apply
должна передавать мне одно значение за раз. Однако здесь этого не происходит, и я не знаю, почему. df['PhoneNumber']
возвращает DataFrame вместо Series, поэтому я должен использовать ссылку на столбец внутри функции.
Таким образом, ВАМ, возможно, придется провести некоторые эксперименты. Если df['PhoneNumber']
возвращает для вас серию, то вам не нужна axis=1
, и вам не нужна строка p = p['PhoneNumber']
в функции.
ОК, при условии наличия модуля «проверки номера телефона», как упоминается в комментариях, это становится:
import phonenumbers
...
def valphone(p):
p = p['PhoneNumber'] # May not be required
n = phonenumbmers.parse(p)
if phonenumbers.is_possible_number(n):
return p
else:
return ''
...
тим, спасибо за ваш ответ. просто любопытно, прежде чем я проверю. почему в строке 1 номера телефона все еще есть дефисы в вашем выходном файле df?
Я оставил все номера в покое. Как вы решите, является ли номер «полным номером телефона»? Компьютеру не так-то просто это решить.
import phonenumbers my_string_number = "+40021234567" my_number = phonenumbers.parse(mystring number) print(phone number.is_possible_number(my_number)) True
Если у вас уже была функция проверки телефонных номеров, почему вы об этом не сказали и почему не использовали ее в своем примере вместо регулярного выражения? Я изменю ответ.
Должен признать. У меня еще не было этой функции. Но вы указали момент, который меня действительно заинтересовал. «Это непростая задача для компа». Я сразу же начал искать библиотеку py и подумал, что опубликую ее в комментариях. Спасибо, Тим.
эй, @tim, я задал вопрос на Shutil здесь stackoverflow.com/questions/72149034/… никто еще не дал канонического ответа. пожалуйста, отзовитесь, если вам повезло с этим в прошлом
temp['PhoneNumber'] = temp['PhoneNumber'].apply(str).str.findall(r'\d').str.join('')
@зеев. Спасибо за ваш ответ. не могли бы вы объяснить свою функцию findall (r'\d')
метод findall возвращает все совпадения (цифры) в список и объединяет их в одну строку
Превосходно. это коротко и мило и тоже работает. Не уверен, что протокол не может отметить оба ответа правильно. но для тех, кто приходит к этому вопросу, пожалуйста, обратите внимание. этот ответ тоже принят
Здесь есть проблема, когда я очистил свою консоль и перезапустил ее. AttributeError: можно использовать аксессор .str только со строковыми значениями!
@JoeTha Прошу прощения за поздний ответ, я обновил свой ответ, чтобы обрабатывать как не строковые значения, так и строки.
@зеев спасибо. это смогло исправить ошибку
Вы имеете в виду, только в колонке
PhoneNumber
? Это важно сказать. Есть ли у вас функция проверки телефонных номеров? Вы можете сделать это легко с помощью.apply
.