Как разделить серию панд на несколько вариантов?

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

Вот мой MWE:

import numpy as np
import pandas as pd

data = """\
2930 Beverly Glen Circle Los Angeles
435 S. La Cienega Blvd. Los Angeles
12224 Ventura Blvd. Studio City
9570 Wilshire Blvd. Beverly Hills
26025 Pacific Coast Hwy. Malibu""".split('\n')

df = pd.DataFrame(data)
print(df)

cities = ['Los Angeles', 'Studio City', 'Beverly Hills','Malibu']

pat = '|'.join([r'(.*)\s({city})' for city in cities])
df = df[0].str.extract(pat,expand=True)
df

Как получить следующий результат:

                                      0 addr                      city
0  2930 Beverly Glen Circle Los Angeles 2930 Beverly Glen Circle Los Angeles
1   435 S. La Cienega Blvd. Los Angeles 435 S. La Cienega Blvd.  Los Angeles
2       12224 Ventura Blvd. Studio City 12224 Ventura Blvd.      Studio City
3     9570 Wilshire Blvd. Beverly Hills 9570 Wilshire Blvd.      Beverly Hills
4       26025 Pacific Coast Hwy. Malibu 26025 Pacific Coast Hwy. Malibu

2 ответа

Решение

Вы должны переместить необязательные совпадения в одну группу захвата:

import pandas as pd

data = """\
2930 Beverly Glen Circle Los Angeles
435 S. La Cienega Blvd. Los Angeles
12224 Ventura Blvd. Studio City
9570 Wilshire Blvd. Beverly Hills
26025 Pacific Coast Hwy. Malibu""".split('\n')

df = pd.DataFrame(data)
print(df)

cities = ['Los Angeles', 'Studio City', 'Beverly Hills','Malibu']
c = '|'.join(cities)
pat = fr'(.*?)\s({c})'                     # fixed pattern with f and r
df = df[0].str.extract(pat,expand=True)
print(df)

Выход:

                          0              1
0  2930 Beverly Glen Circle    Los Angeles
1   435 S. La Cienega Blvd.    Los Angeles
2       12224 Ventura Blvd.    Studio City
3       9570 Wilshire Blvd.  Beverly Hills
4  26025 Pacific Coast Hwy.         Malibu

Вы можете попробовать использовать Series.str.split:

pat = '|'.join([rf'\s(?={city})' for city in cities])
df1 = df[0].str.split(pat, expand=True).rename(columns={0: 'addr', 1: 'city'})
df = pd.concat([df[0], df1], axis=1)

Или вы можете использовать Series.str.extract:

pat = r'(?P<addr>.*)?\s' +  r'(?P<city>' + '|'.join(cities) + r')'
df = pd.concat([df[0], df[0].str.extract(pat, expand=True)], axis=1)

Результат:

# print(df)
                                      0                      addr           city
0  2930 Beverly Glen Circle Los Angeles  2930 Beverly Glen Circle    Los Angeles
1   435 S. La Cienega Blvd. Los Angeles   435 S. La Cienega Blvd.    Los Angeles
2       12224 Ventura Blvd. Studio City       12224 Ventura Blvd.    Studio City
3     9570 Wilshire Blvd. Beverly Hills       9570 Wilshire Blvd.  Beverly Hills
4       26025 Pacific Coast Hwy. Malibu  26025 Pacific Coast Hwy.         Malibu
Другие вопросы по тегам