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

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

Я пробовал как с 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
7
3
1 894
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

import numpy

emails = numpy.array([
    'foo123@foo.com',
    'bar@bar.com',
    '2re23@re.com',
])

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([
    'foo123@foo.com',
    'bar@bar.com',
    '2re23@re.com',
])

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': ['abc123@gmail.com', 'bcdef@hotmail.com',
                         'sdafasf43@abc.com', 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
Ответ принят как подходящий

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

customers_df = pd.DataFrame({'A':['roberto123@example.com','foo123@foo.com',
                                  'bar@bar.com','23re55@re.com'],
                   'B':[4,5,4,5],
                   'C':[7,8,9,4]})

print (customers_df)
                        A  B  C
0  roberto123@example.com  4  7
1          foo123@foo.com  5  8
2             bar@bar.com  4  9
3           23re55@re.com  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]

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