Извлечение и последующее объединение адреса улиц и номеров квартир в пандах - PullRequest
0 голосов
/ 24 октября 2019

Мне очень сложно придумать код, необходимый для выполнения нижеприведенного. С this есть аналогичный вопрос, но я не могу понять, как адаптировать код к моим потребностям.

У меня есть фрейм данных pandas длиной более 100 тыс. Строк. Вот как выглядит формат адреса и номера квартиры в настоящее время:

Текущий DF:

temp = {'col1': ['220 CENTRAL STREET, 50', '165 EAST 66TH ST, RESI', '106 SPRUCE STREET, 1', '14 EAST 67TH STREET', '1131 OGEN AVENUE', '200 EAST 1ST STREET, RU', '520 PARK LANE', '520 PARK LANE', '80 BAY STREET LANDING, 1A', '520 PARK SOUTH, DPH54', '520 PARK LANE', '62 VEST STREET', '256 FLARIN AVENUE'], 'col2':['50', 'RESI', 'nan', 'nan', 'nan', '2A', 'DPH60', 'DPH56', '1A', 'DPH54', 'DPH52', '21F', 'nan']}
data = pd.DataFrame(temp)
data

               col1                   col2
0      220 CENTRAL STREET, 50            50
1      165 EAST 66TH ST, RESI          RESI
2        106 SPRUCE STREET, 1           nan
3         14 EAST 67TH STREET           nan
4            1131 OGEN AVENUE           nan
5     200 EAST 1ST STREET, RU            2A
6               520 PARK LANE         DPH60
7               520 PARK LANE         DPH56
8   80 BAY STREET LANDING, 1A            1A
9       520 PARK SOUTH, DPH54         DPH54
10              520 PARK LANE         DPH52
11             62 VEST STREET           21F
12          256 FLARIN AVENUE           nan


Требуемый DF (data1), который добавляет 3 новых столбца, чтобы впоследствии обеспечить различные уровни детализацииon:

temp1 = {'col1': ['220 CENTRAL STREET, 50', '165 EAST 66TH ST, RESI', '106 SPRUCE STREET, 1', '14 EAST 67TH STREET', '1131 OGEN AVENUE', '200 EAST 1ST STREET, RU', '520 PARK LANE', '520 PARK LANE', '80 BAY STREET LANDING, 1A', '520 PARK SOUTH, DPH54', '520 PARK LANE', '62 VEST STREET', '256 FLARIN AVENUE'],
         'col2':['50', 'RESI', 'nan', 'nan', 'nan', '2A', 'DPH60', 'DPH56', '1A', 'DPH54', 'DPH52', '21F', 'nan'], 
         'building_address':['220 CENTRAL STREET', '165 EAST 66TH ST', '106 SPRUCE STREET', '14 EAST 67TH STREET', '1131 OGEN AVENUE', '200 EAST 1ST STREET', '520 PARK LANE', '520 PARK LANE', '80 BAY STREET LANDING', '520 PARK SOUTH', '520 PARK LANE', '62 VEST STREET', '256 FLARIN AVENUE'],
         'apt_no': ['50', 'RESI', '1', 'nan', 'nan', '2A', 'DPH60', 'DPH56', '1A', 'DPH54', 'DPH52', '21F', 'nan'],
         'full_address':['220 CENTRAL STREET, 50', '165 EAST 66TH ST, RESI', '106 SPRUCE STREET, 1', '14 EAST 67TH STREET', '1131 OGEN AVENUE', '200 EAST 1ST STREET, 2A', '520 PARK LANE, DPH60', '520 PARK LANE, DPH56', '80 BAY STREET LANDING, 1A', '520 PARK SOUTH, DPH54', '520 PARK LANE, DPH52', '62 VEST STREET, 21F', '256 FLARIN AVENUE']}

data1 = pd.DataFrame(temp1)
data1


                col1                   col2       building_address   apt_no  \
0      220 CENTRAL STREET, 50            50     220 CENTRAL STREET     50   
1      165 EAST 66TH ST, RESI          RESI       165 EAST 66TH ST   RESI   
2        106 SPRUCE STREET, 1           nan      106 SPRUCE STREET      1   
3         14 EAST 67TH STREET           nan    14 EAST 67TH STREET    nan   
4            1131 OGEN AVENUE           nan       1131 OGEN AVENUE    nan   
5     200 EAST 1ST STREET, RU            2A    200 EAST 1ST STREET     2A   
6               520 PARK LANE         DPH60          520 PARK LANE  DPH60   
7               520 PARK LANE         DPH56          520 PARK LANE  DPH56   
8   80 BAY STREET LANDING, 1A            1A  80 BAY STREET LANDING     1A   
9       520 PARK SOUTH, DPH54         DPH54         520 PARK SOUTH  DPH54   
10              520 PARK LANE         DPH52          520 PARK LANE  DPH52   
11             62 VEST STREET           21F         62 VEST STREET    21F   
12          256 FLARIN AVENUE           nan      256 FLARIN AVENUE    nan   

                 full_address  
0      220 CENTRAL STREET, 50  
1      165 EAST 66TH ST, RESI  
2        106 SPRUCE STREET, 1  
3         14 EAST 67TH STREET  
4            1131 OGEN AVENUE  
5     200 EAST 1ST STREET, 2A  
6        520 PARK LANE, DPH60  
7        520 PARK LANE, DPH56  
8   80 BAY STREET LANDING, 1A  
9       520 PARK SOUTH, DPH54  
10       520 PARK LANE, DPH52  
11        62 VEST STREET, 21F  
12          256 FLARIN AVENUE  


В существующем DF (данные) col1 - это адрес улицы, который может содержать или не содержать номер квартиры. Для простоты я предполагаю, что значения в столбце col1 будут иметь номер квартиры, если есть запятая. Часть после запятой может рассматриваться как номер квартиры.

col2 содержит только номер квартиры. У него есть Нэн в колонке. В некоторых случаях, например в строке 5, номер квартиры в col2 ('2A') не будет совпадать с частью после запятой в col1 ('RU'). В других случаях, как в строке 2, col2 может быть nan, но col1 имеет номер квартиры после запятой.

Что я хочу сделать, это добавить 3 новых столбца (показанных в Желаемых данных DF1):

['building_address'], по сути, будет содержать все, что находится перед запятой, поэтому будет написано '220 CENTRAL STREET', тогда как col1 скажет '220 CENTRAL STREET, 50'

['apt_no'] будетпроверьте, есть ли нан. Если есть, он будет проверять в столбце col1 значение после запятой. Если проверка прошла успешно, это значение будет занесено в col2. Так, например, в строке 2 data1 apt_no примет значение «1», полученное из части после запятой в col1. Он также проверит, есть ли часть после запятой в col1, и есть ли значение в col2, и если они отличаются, он примет значение в col2. Например, в строке 5 apt_no имеет значение '2A', взятое из col2, даже если col1 показывает 'RU' после запятой. Наконец, если в столбце col1 нет запятой, а столбец col2 равен nan, то apt_no просто остается nan.

['full_address'], наконец, 'full address' объединит ['address address'] и ['apt_no'] в 1 строку в формате адреса здания, apt_no (показано выше). Если «apt_no» равно nan, то «полный адрес» будет таким же, как «col1»

Я боролся с этим часами, но не нашел способа сделать это. Спасибо за поиск.

1 Ответ

0 голосов
/ 24 октября 2019

Вот код, который дает желаемый результат. Я сбрасываю apt_no в ноль в конце, чтобы соответствовать вашему решению.

data['building_address']=data['col1'].str.split(',').str[0]
data['apt_no']=data['col1'].str.split(',').str[1]
data['apt_no'][data['apt_no'].isnull()]=data['col2'][data['apt_no'].isnull()]
data['apt_no'][(data['apt_no'].isnull()) | (data['apt_no']=='nan')]=''
data['full_address']=(data['building_address']+', '+data['apt_no']).str.rstrip(', ')
#Reset to null
data['apt_no'][data['apt_no']=='']=np.nan
...