Замените значения в ячейках None в Pandas регулярным выражением - PullRequest
0 голосов
/ 08 ноября 2019

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

import pandas as pd
import re

df = pd.DataFrame (
data = [
    ['rest_1', 'city City_name, street Street, bld 1'],
    ['rest_2', 'city City_name, street Street Name, bld 2'],
    ['rest_3', 'City_name, street 1-st Street Name, building 2'],
    ['rest_4', 'city City_name, Street Name street, flat 1'],
    ['rest_5', 'City_name city, Streen Name avemue, flat 2'],
    ['rest_6', 'city City_name, bdr Street Name Second_name, flt 3'],
    ['rest_7', 'street Street, bld 3'],
    ['rest_8', 'Doublename Street street, building 4']
],
columns = ['restaurant', 'address']
)

print(df)
    restaurant  address
0   rest_1      city City_name, street Street, bld 1
1   rest_2      city City_name, street Street Name, bld 2
2   rest_3      City_name, street 1-st Street Name, building 2
3   rest_4      city City_name, Street Name street, flat 1
4   rest_5      City_name city, Streen Name avemue, flat 2
5   rest_6      city City_name, bdr Street Name Second_name, f...
6   rest_7      street Street, bld 3
7   rest_8      Doublename Street street, building 4

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

def extract(street):
    try:
        street_name = re.search(',+[\w -№]*,',street).group()
        return street_name[1:-1]
    except:
        print(street)

df['street'] = df['address'].apply(extract)

. Проблема в том, что адреса имеют разные форматы. И некоторые из них не содержат города. Таким образом, в результате я получаю такую ​​таблицу

print(df)   
    restaurant  address                                             street
0   rest_1      city City_name, street Street, bld 1                street Street
1   rest_2      city City_name, street Street Name, bld 2           street Street Name
2   rest_3      City_name, street 1-st Street Name, building 2      street 1-st Street Name
3   rest_4      city City_name, Street Name street, flat 1          Street Name street
4   rest_5      City_name city, Streen Name avemue, flat 2          Streen Name avemue
5   rest_6      city City_name, bdr Street Name Second_name, f...   bdr Street Name Second_name
6   rest_7      street Street, bld 3                                None
7   rest_8      Doublename Street street, building 4                None

Как я могу применить другое регулярное выражение только к ячейкам со значениями None в кадре данных результата и получить такой результат, как

    restaurant  address                                                 street
0   rest_1      city City_name, street Street, bld 1                    street Street
1   rest_2      city City_name, street Street Name, bld 2               street Street Name
2   rest_3      City_name, street 1-st Street Name, building 2          street 1-st Street Name
3   rest_4      city City_name, Street Name street, flat 1  Street Name street
4   rest_5      City_name city, Streen Name avenue, flat 2  Streen Name avenue
5   rest_6      city City_name, bdr Street Name Second_name, f...   bdr Street Name Second_name
6   rest_7      street Street, bld 3                                    street Street
7   rest_8      Doublename Street street, building 4    Doublename      Doublename Street street

Будетблагодарен за любую помощь!

1 Ответ

0 голосов
/ 08 ноября 2019

Я сделал это простым циклом:

for i in df[df['street'].isnull()].index:
    data.loc[i,'street'] = re.search('^[\w -№]*,',data.loc[i,'address']).group()

и получил нужный мне результат

...