2
votes

python - obtenir le code postal de l'adresse complète

J'ai un dataframe avec les adresses complètes dans une colonne, et je dois créer une colonne séparée avec juste le code postal. Certaines adresses ont juste le code postal à cinq chiffres tandis que d'autres ont les quatre chiffres supplémentaires.

Comment diviser la colonne pour obtenir simplement le code postal?

Exemple de données

name    address                                zipcode
bob     123 6th Street,Sterling VA 20165-7513  20165-7513
john    567 7th Street, Wilmington NC 28411    28411

J'ai essayé d'utiliser rpartition mais j'obtiens tout avant le code postal:

df['test'] = df['address'].str.rpartition(" ")
print(df)
name    address                                test
bob     123 6th Street,Sterling VA 20165-7513  123 6th Street,Sterling VA
john    567 7th Street, Wilmington NC 28411    567 7th Street, Wilmington NC

Voici ce que j'essaye d'obtenir:

d = {'name':['bob','john'],'address':['123 6th Street,Sterling VA 20165-7513','567 7th Street, Wilmington NC 28411']}
df = pd.DataFrame(d)


2 commentaires

Peut-on supposer en toute sécurité que le code postal est à la fin?


@fizzybear Oui, le code postal est toujours à la fin.


3 Réponses :


4
votes

Utilisez une expression régulière avec str.extract():

   name                                address         zip
0   bob  123 6th Street,Sterling VA 20165-7513  20165-7513
1  john    567 7th Street, Wilmington NC 28411       28411

returns:

df['zip'] = df['address'].str.extract(r'(\d{5}\-?\d{0,4})')

Voir le page pandas sur str. extract () et la page python sur re .

En particulier, le {5} spécifie qu'il faut faire correspondre 5 répétitions de \ d (un chiffre), tandis que {0,4} indique que nous pouvons faire correspondre de 0 à 4 répétitions.


0 commentaires

1
votes

Vous pouvez essayer ceci

df['zip']= [i[-1] for i in df.address.str.split(' ').values]


0 commentaires

0
votes

Vous devez diviser les espaces, obtenir le dernier élément et vous aurez le code postal.

Quelque chose comme ça:

zipcodes = list()

for item in d['address']:
    zipcode = item.split()[-1]
    zipcodes.append(zipcode)

d['zipcodes'] = zipcodes
df = pd.DataFrame(d)


0 commentaires