Используйте .str.extract
, чтобы получить Series
состояний, а затем используйте pd.get_dummies
для этого Series
.Нужно будет определить список всех 50 состояний:
import pandas as pd
states = ['Texas', 'New York', 'Kentucky', 'Virginia']
pd.get_dummies(df.col1.str.extract('(' + '|'.join(x+',' for x in states)+ ')')[0].str.strip(','))
Kentucky New York Texas Virginia
0 0 0 1 0
1 0 1 0 0
2 0 0 0 0
3 0 0 1 0
4 0 0 0 1
5 1 0 0 0
Примечание. Я сопоставил состояния, за которыми следует ','
, так как это выглядит как шаблон и позволяет избежать ложных совпадений, таких как 'Virginia'
с'Virginia Beach'
, или более проблемные вещи, такие как 'Washington County, Minnesota'
Если вы ожидаете, что состояния мултиплей будут совпадать в одной строке, то это станет суммой .extractall
по 0-му уровню:
pd.get_dummies(df.col1.str.extractall('(' + '|'.join(x+',' for x in states)+ ')')[0].str.strip(',')).sum(level=0).clip(upper=1)
Редактировать:
Возможно, есть лучшие способы, но это может быть немного безопаснее, как предложено @BradSolomon, разрешающим совпадения на 'State,( optional 5 digit Zip,) USA'
states = ['Texas', 'New York', 'Kentucky', 'Virginia', 'California', 'Pennsylvania']
pat = '(' + '|'.join(x+',?(\s\d{5},)?\sUSA' for x in states)+ ')'
s = df.col1.str.extract(pat)[0].str.split(',').str[0]
Вывод: s
0 Texas
1 New York
2 NaN
3 Texas
4 Virginia
5 Kentucky
6 Pennsylvania
Name: 0, dtype: object
с входа
col1
0 Crockett, Houston County, Texas, 75835, USA
1 NYC, New York, USA
2 Warszawa, mazowieckie, RP
3 Texas, USA
4 Virginia Beach, Virginia, 23451, USA
5 Louisville, Jefferson County, Kentucky, USA
6 California, Pennsylvania, USA