У меня есть датафрейм с полными адресами в столбце, и мне нужно создать отдельный столбец только с почтовым индексом. Некоторые из адресов имеют только пятизначный почтовый индекс, в то время как другие имеют дополнительные четыре цифры.

Как разделить столбец, чтобы получить почтовый индекс?

Пример данных

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

Я пытался использовать rpartition, но я получаю все до почтового индекса:

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

Вот что я пытаюсь получить:

name    address                                zipcode
bob     123 6th Street,Sterling VA 20165-7513  20165-7513
john    567 7th Street, Wilmington NC 28411    28411
2
Dread 5 Июл 2019 в 23:27

3 ответа

Лучший ответ

Используйте регулярное выражение с str.extract():

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

Возвращает :

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

См. Страницу панд в {{X0 }} и страница Python на re,

В частности, {5} указывает, что мы должны сопоставить 5 повторений \d (числовая цифра), а {0,4} указывает, что мы можем сопоставить от 0 до 4 повторений.

2
Brendan 5 Июл 2019 в 20:50

Вам нужно разделить пробелы, получить последний элемент, и вы получите почтовый индекс.

Что-то вроде этого:

zipcodes = list()

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

d['zipcodes'] = zipcodes
df = pd.DataFrame(d)
0
João Victor Monte 5 Июл 2019 в 20:53

Вы можете попробовать это

df['zip']= [i[-1] for i in df.address.str.split(' ').values]
1
Fouad Selmane 5 Июл 2019 в 20:51