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)
3 Réponses :
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.
Vous pouvez essayer ceci
df['zip']= [i[-1] for i in df.address.str.split(' ').values]
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)
Peut-on supposer en toute sécurité que le code postal est à la fin?
@fizzybear Oui, le code postal est toujours à la fin.