Создание панд df столбцов с элементами списка неравной длины? - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть список адресов, которые я хотел бы поместить в информационный кадр, где каждая строка - это новый адрес, а столбцы - это единицы адреса (название, улица, город).

Однако,Как структурирован список, некоторые адреса длиннее других.Например:

address = ['123 Some Street, City','45 Another Place, PO Box 123, City']

У меня есть файл данных pandas со следующими столбцами:

Index     Court       Address                              Zipcode   Phone                           
0         Court 1     123 Court Dr, Springfield            12345     11111
1         Court 2     45 Court Pl, PO Box 45, Pawnee       54321     11111
2         Court 3     1725 Slough Ave, Scranton            18503     11111
3         Court 4     101 Court Ter, Unit 321, Eagleton    54322     11111

Я хотел бы разбить столбец адреса на до трех столбцовв зависимости от того, сколько разделителей запятых в адресе, с заполнением NaN, где значения будут отсутствовать.

Например, я надеюсь, что данные будут выглядеть так:

Index     Court       Address          Address2     City           Zip  Phone                                          
0         Court 1     123 Court Dr     NaN          Springfield    ...   ...           
1         Court 2     45 Court Pl      PO Box 45    Pawnee         ...   ...
2         Court 3     1725 Slough Ave  NaN          Scranton       ...   ...
3         Court 4     101 Court Ter    Unit 321     Eagleton       ...   ...

Iпробовал и попробовал множество различных решений на StackOverflow безрезультатно.Самое близкое, что я получил, с этим кодом:

df2 = pd.concat([df, df['Address'].str.split(', ', expand=True)], axis=1)

Но он возвращает фрейм данных, который добавляет следующие три столбца в конец, структурированные так:

...  0              1             2
... 123 Court Dr   Springfield   None
... 45 Court Pl    PO Box 45     Pawnee

Это близко,но, как вы можете видеть, для более коротких записей город совпадает со второй адресной строкой для более длинных записей.

В идеале, столбец 2 должен заполнять каждую строку городом, а столбец 1 должен чередоваться между«Нет» и вторая адресная строка, если применимо.

Надеюсь, это имеет смысл - это сложно выразить словами.Спасибо!

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

Вы можете сделать что-то вроде этого:

df['Address1'] = df['Address'].str.split(',').str[0]
df['Address2'] = df['Address'].str.extract(',(.*),')
df['City'] = df['Address'].str.split(',').str[-1]
0 голосов
/ 05 февраля 2019

Вы можете посмотреть на создание функции, используя пакет usaddress .Мне было очень полезно, когда мне нужно разделить адрес на части:

import usaddress

df = pd.DataFrame(['123 Main St. Suite 100 Chicago, IL', '123 Main St. PO Box 100 Chicago, IL'], columns=['Address'])

Затем создайте функции для того, как вы хотите разделить данные:

def Address1(x):
    try:
        data = usaddress.tag(x)
        if 'AddressNumber' in data[0].keys() and 'StreetName' in data[0].keys() and 'StreetNamePostType' in data[0].keys():
            return data[0]['AddressNumber'] + ' ' + data[0]['StreetName'] + ' ' + data[0]['StreetNamePostType']
    except:
        pass

def Address2(x):
    try:
        data = usaddress.tag(x)
        if 'OccupancyType' in data[0].keys() and 'OccupancyIdentifier' in data[0].keys():
            return data[0]['OccupancyType'] + ' ' + data[0]['OccupancyIdentifier']
        elif 'USPSBoxType' in data[0].keys() and 'USPSBoxID' in data[0].keys():
            return data[0]['USPSBoxType'] + ' ' + data[0]['USPSBoxID']
    except:
        pass

def PlaceName(x):
    try:
        data = usaddress.tag(x)
        if 'PlaceName' in data[0].keys():
            return data[0]['PlaceName']
    except:
        pass

df['Address1'] = df.apply(lambda x: Address1(x['Address']), axis=1)
df['Address2'] = df.apply(lambda x: Address2(x['Address']), axis=1)
df['City'] = df.apply(lambda x: PlaceName(x['Address']), axis=1)

out:

                               Address      Address1    Address2     City
0   123 Main St. Suite 100 Chicago, IL  123 Main St.   Suite 100  Chicago
1  123 Main St. PO Box 100 Chicago, IL  123 Main St.  PO Box 100  Chicago
0 голосов
/ 05 февраля 2019

Адреса, особенно созданные человеком, могут быть хитрыми.Но, если ваши адреса соответствуют только этим двум форматам, это будет работать:

Примечание. Если существует дополнительный формат, который вы должны учитывать, то это распечатает виновника.

def split_address(df):
    for index,row in df.iterrows():
        full_address = df['address']
        if full_address.count(',') == 3:
            split = full_address.split(',')
            row['address_1'] = split[0]
            row['address_2'] = split[1]
            row['city'] = split[2]
        else if full_address.count(',') == 2:
            split = full_address.split(',')
            row['address_1'] = split[0]
            row['city'] = split[1]
        else:
            print("address does not fit known formats {0}".format(full_address))

По существудве вещи, которые должны вам помочь, это функция string.count(), которая сообщит вам количество запятых в строке, и string.split(), который вы уже нашли, который разделит входные данные в массив.Вы можете ссылаться на части этого массива, чтобы разместить части в правильном столбце.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...