Cela fait quelques heures que je suis coincé avec ceci: J'ai un DataFrame contenant une liste d'adresses e-mail, à partir de ces adresses e-mail, je veux vérifier si le courrier contient ou non un numéro I.E. roberto123@example.com, si oui, je veux que ce numéro soit ajouté à un tableau:

J'ai essayé les deux avec un DataFrame, et aussi un ndarray avec numpy, mais cela ne fonctionne pas. Voici ce que j'essaie de faire:

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)

Je pense que mon problème est que je ne sais pas comment convertir tous les éléments de ce tableau en chaîne afin que la méthode isdigit() fonctionne et répète tous les éléments à l'intérieur (825 adresses de messagerie).

Lors de l'exécution du code ci-dessus, voici l'erreur que j'obtiens:

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

Pendant ce temps, si j'essaie avec le tableau numpy (mail_addresses_toArray), c'est l'erreur:

AttributeError: 'numpy.ndarray' object has no attribute 'isdigit'
7
roberto.sannazzaro 11 avril 2018 à 14:18

3 réponses

Meilleure réponse

Utilisez extract si chaque e-mail ne contient qu'un number ou findall s'il y en a plusieurs:

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]
3
jezrael 11 avril 2018 à 12:01

On dirait:

A) vous devez corriger la façon dont vous créez mail_addresses. D'une certaine manière, il est plein d'objets numpy.int64 au lieu de chaînes contenant des adresses e-mail, comme vous vous y attendez.

B) une fois ce tri effectué, vous devez utiliser la méthode .isdigit sur les caractères individuels de chaque adresse e-mail. Actuellement, vous l'appelez sur une adresse e-mail complète à la fois. Voici un exemple de ce que je veux dire:

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)

Production:

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

Si vous voulez les nombres entiers au lieu de seulement les chiffres, vous pouvez utiliser une expression régulière:

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)

Production:

[123, 2, 23]
1
tel 11 avril 2018 à 11:50

Voici une façon.

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]
2
jpp 11 avril 2018 à 11:46