Проверьте, содержит ли DataFrame или ndrray цифры

Прошло несколько часов, и я застрял в этом: У меня есть DataFrame, содержащий список адресов электронной почты, из которых я хочу проверить, содержится ли в письме номер I.E. [email protected], если да, я хочу, чтобы это число было добавлено к массиву:

Я пробовал как с DataFrame, так и с ndarray woth numpy, но это не работает. Вот что я пытаюсь сделать:

mail_addresses = pd.DataFrame(customers_df.iloc[:,0].values)
mail_addresses = mail_addresses.dropna(axis = 0, how= 'all')
mail_addresses_toArray = mail_addresses.values

for i in mail_addresses:
dates =[]
if any(i.isdigit()) == True:
    dates.append(i)
    print(dates)

Я думаю, что моя проблема в том, что я не знаю, как преобразовать все элементы в этом массиве в строку, чтобы метод isdigit() работал и перебирал все элементы внутри (825 почтовых адресов).

При запуске кода, приведенного выше, я получаю ошибку:

AttributeError: 'numpy.int64' object has no attribute 'isdigit'

Между тем, если я попытаюсь использовать массив numpy (mail_addresses_toArray), это будет ошибка:

AttributeError: 'numpy.ndarray' object has no attribute 'isdigit'

Без дополнительной информации сложно понять, что не так с mail_addresses. Не могли бы вы опубликовать код, который вы использовали для создания customers_df, или вывод print(mail_addresses)? Если результат очень длинный, просто опубликуйте его образец

tel 11.04.2018 13:37

Вот как я создаю mail_addresses: mail_addresses = customers_df.iloc [:, 0] .values ​​по соображениям конфиденциальности, я не могу опубликовать содержимое этого файла.

roberto.sannazzaro 11.04.2018 13:41

Просто опубликуйте версию с несколькими придуманными электронными письмами. Что бы ни случилось с mail_addresses, это в той части кода, которую вы не опубликовали.

tel 11.04.2018 13:46
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
7
3
1 894
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Это выглядит как:

а) вам нужно исправить то, как вы создаете mail_addresses. Почему-то он заполнен объектами numpy.int64 вместо строк, содержащих адреса электронной почты, как вы ожидаете.

б) после того, как вы все отсортировали, вам нужно использовать метод .isdigit для отдельных символов каждого адреса электронной почты. В настоящее время вы звоните на него по всему адресу электронной почты за раз. Вот пример того, что я имею в виду:

import numpy

emails = numpy.array([
    '[email protected]',
    '[email protected]',
    '[email protected]',
])

digits = []

for email in emails:
    # first we loop over each email in the array
    for c in email:
        # then we loop over each character `c` in an email
        if c.isdigit():
            digits.append(int(c))

print(digits)

выход:

[1, 2, 3, 2, 2, 3]

Если вам нужны целые числа, а не только цифры, вы можете использовать регулярное выражение:

import numpy
import re

numRe = re.compile('\d+')

emails = numpy.array([
    '[email protected]',
    '[email protected]',
    '[email protected]',
])

digits = [int(num) for email in emails for num in numRe.findall(email)]

print(digits)

выход:

[123, 2, 23]

Вот один способ.

import pandas as pd

df = pd.DataFrame({'A': ['[email protected]', '[email protected]',
                         '[email protected]', None]})

s = df['A'].dropna()

t = s.map(lambda x: ''.join([i for i in x if i.isdigit()]).strip())
res = t.loc[t != ''].map(int).tolist()

# [123, 43]

Обязательно ли иметь словарь?

roberto.sannazzaro 11.04.2018 13:47

Нет, это простой способ. Я предполагаю, что у вас уже есть фрейм данных для работы, как в вашем вопросе. Решение по-прежнему будет работать с вашим фреймворком данных.

jpp 11.04.2018 13:47

У меня есть фрейм данных, но я конвертирую его в ndarray, используя .as_matrix ()

roberto.sannazzaro 11.04.2018 13:48

@ roberto.sannazzaro, нет причин для этого, если вам нужен list в конце. Я работаю с тем, что у вас есть в вашем вопросе. Если у вас есть особые требования, укажите минимальный воспроизводимый пример.

jpp 11.04.2018 13:49

и я заметил, что использование вашего кода возвращает мне ошибку «объект 'DataFrame' не имеет атрибута 'map'». Как вы думаете, мне следует преобразовать его в массив numpy?

roberto.sannazzaro 11.04.2018 13:50

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

jpp 11.04.2018 13:52

Позвольте нам продолжить обсуждение в чате.

roberto.sannazzaro 11.04.2018 13:54
Ответ принят как подходящий

Используйте extract, если каждое письмо содержит только один number, или findall, если возможно несколько:

customers_df = pd.DataFrame({'A':['[email protected]','[email protected]',
                                  '[email protected]','[email protected]'],
                   'B':[4,5,4,5],
                   'C':[7,8,9,4]})

print (customers_df)
                        A  B  C
0  [email protected]  4  7
1          [email protected]  5  8
2             [email protected]  4  9
3           [email protected]  5  4

L = customers_df.iloc[:,0].str.extract('(\d+)', expand=False).dropna().astype(int).tolist()
print (L)
[123, 123, 23]

L = np.concatenate(customers_df.iloc[:,0].str.findall('(\d+)')).astype(int).tolist()
print (L)
[123, 123, 23, 55]

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