Создание нового столбца во фрейме данных Pandas из индекса определенного символа в другом столбце

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

Email
kitty@gmail.com
cat@yahoo.com
dog@aol.com
person@hrc.com

Тип данных этого столбца / ряда-UNICODE, который, похоже, не работает для того, что я пытаюсь сделать. То, что я хотел бы получить, это столбец только доменов электронной почты в формате str, что-то вроде этого:

Domain
gmail.com
yahoo.com
aol.com
hrc.com

Я пробовал делать это:

df['domain'] = df['Email'][:,df['Email'].find('@'):]

но я получаю ошибку атрибута:»серия’ объект не имеет атрибута ‘найти».

Я искал по всему переполнению стека, но нашел только способы выбора подстрок на основе одного выбранного целого числа, но это не работает в этой ситуации, так как расположение » @ » отличается в каждом экземпляре. Я бы очень хотел избежать использования цикла for для этого. Кто-нибудь знает простой способ сделать это? Я считаю, что тип данных UNICODE может вмешиваться.

РЕДАКТИРОВАТЬ:
Решение, предоставляемое @rojeeer, отлично работает, когда я создаю образцы данных в отдельной среде (iPython), но используя его на таблице в Databricks( Python 2.7.10), я постоянно получаю ошибки:

TypeError: split() got an unexpected keyword argument 'return_type'
TypeError: split() got an unexpected keyword argument 'expand'

Я считаю, что это связано с тем, что данные в моей таблице кодируются как Unicode (или unencoded). Я пробовал несколько вещей, чтобы преобразовать его в str:

df[‘email’] = df[‘email’].map(lambda x: x.encode("utf-8"))
df[‘email’] = df[‘email’].encode("utf-8")

Я также пытался нормализовать данные, пробуя эти подходы:

import unicodedata as ucd
df[‘email’] = ucd.normalize('NFKD', df[‘email’])

import unicodedata as ucd
df[‘email’] = ucd.normalize('NFKD', df[‘email’]).encode(‘ascii’,’ignore’)

import unicodedata as ucd

df[‘email’]= df[‘email’].map(lambda x: ucd.normalize('NFKD', x))

Эти постоянно возвращаемые ошибки:

AttributeError: 'NoneType' object has no attribute 'encode'
TypeError: must be unicode, not None

Как конвертировать эту серию в str?

1 ответ

  1. В Pandas strфункции не могут быть вызваны напрямую , вам нужно вызвать его какdf.str.function, см. Работа с текстом .

    Для вас приложение, я думаю, что два функции могут быть вашим выбором: str.splitи str.extract. str.splitFor Seriesочень похож splitна strразделяемую строку обычными экспресс-разделителями. В то время str.extractкак является более мощным, чтобы указать, как извлечь.

    Вот пример кода:

    In [16]: df['Email'].str.split('@', expand=True)
    Out[16]: 
            0          1
    0   kitty  gmail.com
    1     cat  yahoo.com
    2     dog    aol.com
    3  person    hrc.com
    

    Set expand=Trueразвернет значение SeriesDataFrameсодержит столько столбцов, сколько длина результатов разбиения.

    Надеюсь, это будет полезно.