Прошло несколько часов, и я застрял в этом:
У меня есть 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: mail_addresses = customers_df.iloc [:, 0] .values по соображениям конфиденциальности, я не могу опубликовать содержимое этого файла.
Просто опубликуйте версию с несколькими придуманными электронными письмами. Что бы ни случилось с mail_addresses
, это в той части кода, которую вы не опубликовали.
Это выглядит как:
а) вам нужно исправить то, как вы создаете 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]
Обязательно ли иметь словарь?
Нет, это простой способ. Я предполагаю, что у вас уже есть фрейм данных для работы, как в вашем вопросе. Решение по-прежнему будет работать с вашим фреймворком данных.
У меня есть фрейм данных, но я конвертирую его в ndarray, используя .as_matrix ()
@ roberto.sannazzaro, нет причин для этого, если вам нужен list
в конце. Я работаю с тем, что у вас есть в вашем вопросе. Если у вас есть особые требования, укажите минимальный воспроизводимый пример.
и я заметил, что использование вашего кода возвращает мне ошибку «объект 'DataFrame' не имеет атрибута 'map'». Как вы думаете, мне следует преобразовать его в массив numpy?
Нет. Вы точно скопировали и вставили мой код? Я не думаю, что у тебя есть.
Позвольте нам продолжить обсуждение в чате.
Используйте 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]
Без дополнительной информации сложно понять, что не так с
mail_addresses
. Не могли бы вы опубликовать код, который вы использовали для созданияcustomers_df
, или выводprint(mail_addresses)
? Если результат очень длинный, просто опубликуйте его образец