Извлекая город и штат из столбца местоположения, вместо этого нажмите AttributeError - PullRequest
0 голосов
/ 04 февраля 2020

Я хочу очистить столбец location, удалив почтовые индексы, но я получаю следующую ошибку при извлечении и использовании регулярного выражения:

AttributeError: 'str' object has no attribute 'str'

Вот примерный фрейм данных только со столбцом местоположения :

In [52]: df
Out[52]:
                       location
0    New Feliciamouth, WA 16422
1           Bakerfurt, CO 76376
2  Lake Elizabethview, GA 59017
3      Robertschester, TX 92366
4       Robinsonmouth, AL 99445
5        North Connor, AZ 79552
6          Morganstad, WA 73506
7         New Roberto, IA 11832
8         Collierstad, DC 22151
9          Reneemouth, NJ 93901

(это данные, сгенерированные случайным образом для иллюстрации проблемы).

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

New Feliciamouth, WA
       Bakerfurt, CO

et c.

Я использую этот код:

def get_city(address):
    pattern = r'(.+\,\w.+)\w.+)'
    return address.str.extract(pattern,flags=re.I)

location = df['location']        
location.apply(get_city)
location.head()

Однако, я получаю исключение при запуске этого:

AttributeError                            Traceback (most recent call last)
<ipython-input-62-cdec695003fd> in <module>
      4
      5 location = df['location']
----> 6 location.apply(get_city)
      7 location.head()

.../lib/python3.8/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   4043             else:
   4044                 values = self.astype(object).values
-> 4045                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   4046
   4047         if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-62-cdec695003fd> in get_city(address)
      1 def get_city(address):
      2     pattern = r'(.+\,\w.+)\w.+)'
----> 3     return address.str.extract(pattern,flags=re.I)
      4
      5 location = df['location']

AttributeError: 'str' object has no attribute 'str'

Или при удалении .str перед извлекая я получаю:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-63-bfed6f810b40> in <module>
      4
      5 location = df['location']
----> 6 location.apply(get_city)
      7 location.head()

.../lib/python3.8/site-packages/pandas/core/series.py in apply(self, func, convert_dtype, args, **kwds)
   4043             else:
   4044                 values = self.astype(object).values
-> 4045                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   4046
   4047         if len(mapped) and isinstance(mapped[0], Series):

pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-63-bfed6f810b40> in get_city(address)
      1 def get_city(address):
      2     pattern = r'(.+\,\w.+)\w.+)'
----> 3     return address.extract(pattern,flags=re.I)
      4
      5 location = df['location']

AttributeError: 'str' object has no attribute 'extract'

1 Ответ

0 голосов
/ 04 февраля 2020

Series.apply() передает каждое значение в вашу функцию get_city(). Вы не можете использовать Series.str.... функции для одного строкового значения, у вас нет всей серии.

Поскольку у вас есть векторизованная строковая функция для этого, не используйте Series.apply() , просто используйте Series.str.extract метод напрямую в столбце location:

pattern = r'([^,]+,\s*\w+)\s*\d*'
location = df['location'].str.extract(pattern, flags=re.I)
location.head()

Обратите внимание, что я также изменил ваш шаблон регулярного выражения:

  • Там был дополнительный ), что делает шаблон недействительным, потому что для него отсутствовало отверстие (.
  • Я заменил .+ в начале на [^,]+, поэтому запятая никогда не совпадал.
  • Я вставил \s* после запятой, чтобы учесть пробел между запятой и состоянием.
  • Я заменил \w.+ просто \w+, вы не делаете хотите письмо, за которым следует что угодно, вы хотите только буквы. Однако попробуйте найти здесь только заглавные буквы и ограничьте длину. [A-Z]{,3} допускает от нуля до трех заглавных букв.
  • Почтовый индекс теперь соответствует ряду цифр. После этого шаблон может по-прежнему соответствовать дополнительным символам, но они не будут частью извлеченного значения.

Демонстрация с использованием одного полного значения столбца, которое фактически отображается на снимке экрана:

In [1]: import pandas as pd

In [2]: import re

In [3]: df = pd.DataFrame([["Atlanta, GA 30301"]], columns=["location"])

In [4]: pattern = r'([^,]+,\s*\w+)\s*\d*'

In [5]: df['location'].str.extract(pattern, flags=re.I)
Out[5]:
                        0
0    New Feliciamouth, WA
1           Bakerfurt, CO
2  Lake Elizabethview, GA
3      Robertschester, TX
4       Robinsonmouth, AL
5        North Connor, AZ
6          Morganstad, WA
7         New Roberto, IA
8         Collierstad, DC
9          Reneemouth, NJ
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...