Построение фрейма данных с несколькими столбцами на основе условий str с использованием цикла - python - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть скопированный в Twitter DataFrame, который включает местоположение пользователя.Переменная местоположения выглядит следующим образом:

2          Crockett, Houston County, Texas, 75835, USA
3                                   NYC, New York, USA
4                            Warszawa, mazowieckie, RP
5                                           Texas, USA
6                 Virginia Beach, Virginia, 23451, USA
7          Louisville, Jefferson County, Kentucky, USA

Я хотел бы построить макеты для всех штатов США, используя цикл.

Мне удалось извлечь пользователей из США, используя

location_usa = location_df['location'].str.contains('usa', case = False)

Однако код был бы слишком громоздким, я написал это для каждого отдельного состояния.У меня есть список состояний в виде строк.Также я не могу использовать

pd.Series.Str.get_dummies()

, поскольку в одном и том же штате есть разные места, и каждая запись представляет собой целое предложение.

Я бы хотел, чтобы вывод выглядел примерно так:

   Alabama   Alaska  Arizona
1        0        0        1
2        0        1        0
3        1        0        0 
4        0        0        0

Или то же самое с логическими значениями.

1 Ответ

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

Используйте .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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...