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

у меня есть датафрейм

>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

Вы имеете в виду, только в колонке PhoneNumber? Это важно сказать. Есть ли у вас функция проверки телефонных номеров? Вы можете сделать это легко с помощью .apply.

Tim Roberts 05.05.2022 21:50

Только столбец с номером телефона

Joe Tha 05.05.2022 21:53

@TimRoberts я отредактировал свой вопрос. Спасибо. Кстати, ты выглядишь очень знакомо.

Joe Tha 05.05.2022 22:00
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это делает работу.

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?

Joe Tha 05.05.2022 22:21

Я оставил все номера в покое. Как вы решите, является ли номер «полным номером телефона»? Компьютеру не так-то просто это решить.

Tim Roberts 05.05.2022 22:27

import phonenumbers my_string_number = "+40021234567" my_number = phonenumbers.parse(mystring number) print(phone number.is_possible_number(my_number)) True

Joe Tha 05.05.2022 22:36

Если у вас уже была функция проверки телефонных номеров, почему вы об этом не сказали и почему не использовали ее в своем примере вместо регулярного выражения? Я изменю ответ.

Tim Roberts 05.05.2022 22:44

Должен признать. У меня еще не было этой функции. Но вы указали момент, который меня действительно заинтересовал. «Это непростая задача для компа». Я сразу же начал искать библиотеку py и подумал, что опубликую ее в комментариях. Спасибо, Тим.

Joe Tha 05.05.2022 22:49

эй, @tim, я задал вопрос на Shutil здесь stackoverflow.com/questions/72149034/… никто еще не дал канонического ответа. пожалуйста, отзовитесь, если вам повезло с этим в прошлом

Joe Tha 07.05.2022 07:52
temp['PhoneNumber'] = temp['PhoneNumber'].apply(str).str.findall(r'\d').str.join('')

@зеев. Спасибо за ваш ответ. не могли бы вы объяснить свою функцию findall (r'\d')

Joe Tha 05.05.2022 23:01

метод findall возвращает все совпадения (цифры) в список и объединяет их в одну строку

Ze'ev Ben-Tsvi 05.05.2022 23:03

Превосходно. это коротко и мило и тоже работает. Не уверен, что протокол не может отметить оба ответа правильно. но для тех, кто приходит к этому вопросу, пожалуйста, обратите внимание. этот ответ тоже принят

Joe Tha 05.05.2022 23:19

Здесь есть проблема, когда я очистил свою консоль и перезапустил ее. AttributeError: можно использовать аксессор .str только со строковыми значениями!

Joe Tha 05.05.2022 23:50

@JoeTha Прошу прощения за поздний ответ, я обновил свой ответ, чтобы обрабатывать как не строковые значения, так и строки.

Ze'ev Ben-Tsvi 06.05.2022 11:11

@зеев спасибо. это смогло исправить ошибку

Joe Tha 06.05.2022 18:47

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