Подробнее Idiomati c способ извлечения значений столбца и присвоения его обратно в DF (Pandas) - PullRequest
0 голосов
/ 24 марта 2020

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

Моя программа работает следующим образом, я создал класс, в котором должна быть полная адресная строка, которую мне нужно обработать. Таким образом, этот класс имеет 4 атрибута, а именно: адрес, штат, город и почтовый индекс.

Это упомянутый класс:

class Address:

    def __init__(self, fulladdress):
        self.fulladdress = fulladdress.split(",")
        self.address = self.get_address()
        self.city = self.get_city()
        stateandzip = str(self.fulladdress[-1]).strip()
        self.statezip = stateandzip.split(" ")
        self.state = self.get_state()
        self.zipcode = self.get_zipcode()

    def get_address(self):
        len_address = len(self.fulladdress)
        if len_address == 3:
            return self.fulladdress[0].strip()
        elif len_address == 4:
            return self.fulladdress[0].strip() + ", " + self.fulladdress[1].strip()
        elif len_address > 5:
            temp_address = self.fulladdress[0]
            for ad in self.fulladdress[0:-3]:
                temp_address = temp_address + ", " + ad.strip()
            return temp_address
        else:
            return ''

    def get_city(self):
        if len(self.fulladdress) > 0:
            address = self.fulladdress[-2]
            return address.strip()
        else:
            return ''

    def get_state(self):
        if len(self.fulladdress) > 0:
            return self.statezip[0]
        else:
            return ''

    def get_zipcode(self):
        if len(self.fulladdress) > 0:
            return self.statezip[1]
        else:
            return ''

Теперь моей существующей подпрограмме необходимо добавить эти результаты в мой массив данных, основанный на столбце адреса. Для анализа адресных данных я использовал df.iterrows (), поскольку не знаю, как использовать класс адресов с помощью метода df.apply.

Вот процедура:

import pandas as pd
import datahelper as dh
import address as ad

# Find the header name of the Address column
address_header = dh.findcolumn('Address', list(df.columns))
header_loc = df.columns.get_loc(address_header)

address = []
city = []
state = []
zipcode = []

for index, row in df.iterrows():
    if not row[address_header]:
       address.append('')
       city.append('')
       state.append('')
       zipcode.append('')
       continue

       # extract details from the address
       address_data = ad.Address(row[address_header])

       address.append(address_data.address)
       city.append(address_data.city)
       state.append(address_data.state)
       zipcode.append(address_data.zipcode)

df[address_header] = address
df.insert(header_loc + 1, 'City', city)
df.insert(header_loc + 2, 'State', state)
df.insert(header_loc + 3, 'Zip Code', zipcode)

Я был бы очень признателен, если бы кто-то указал мне правильное направление. Заранее спасибо.

Кстати, dh - это модуль datahelper, куда я поместил все свои вспомогательные функции.

def findcolumn(searchstring, list):
    if searchstring in list:
        return searchstring
    else:
        try:
            return [i for i in list if searchstring in i][0]
        except ValueError:
            return None
        except IndexError:
            return None

А вот мой желаемый вывод, учитывая пример данных из столбца Address.

df = pd.DataFrame({'Address': ['Rubin Center Dr Ste, Fort Mill, SC 29708', 'Miami, FL 33169']})

Вывод должен быть:

Address             | City    | State | Zip Code
--------------------------------------------------
Rubin Center Dr Ste |Fort Mill|  SC   |29708
--------------------------------------------------
                    |Miami    | FL    |33169
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...