2016-04-15 4 views
3

Я изучаю титанический набор данных и хочу создать столбец с похожими именами. Например, любое имя, содержащее «Чарльз», будет отображаться как «ch», так как я хочу сделать некоторую группу, используя их позже. Я создал функцию, используя следующий код:str.contains для создания нового столбца в pandas dataframe

def cont(Name): 
    for a in Name: 
     if a.str.contains('Charles'): 
      return('Ch') 

и затем наносят с помощью этого:

titanic['namest']=titanic['Name'].apply(cont,axis=1) 

Ошибка: 'str' object has no attribute 'str'

notebook_link

+0

Вы можете просто сделать 'titanic.loc [. титанический [ 'Name'] str.contains ('Charles'), 'Náměšť'] =«Ch'' – EdChum

+0

Вы должны принять один из если он разрешил ваш вопрос, это значит, что вопрос не остается без ответа – EdChum

ответ

4

Вместо того, чтобы использовать цикл или apply вы можете использовать vectorised str.contains возвращать булеву маску и установить все строки, где условие встречались до нужного значения:

titanic.loc[titanic['Name'].str.contains('Charles'), 'namest'] = 'Ch' 
3

apply будет вызывать функцию cont и передать это значение из столбца Name, значение по значению. Это означает, что переменная Name внутри функции cont уже является строкой.

Также обратите внимание, что каждая функция, которая используется apply, должна вернуть что-то, поэтому, если имя не содержит «Charles», само имя возвращается.

Также 2, Seriesapply метод не содержит аргумент ключевого слова axis.

def cont(Name): 
    if 'Charles' in Name: 
     return 'Ch' 
    return Name 

Вам не нужно даже определить его:

titanic['namest'] = titanic['Name'].apply(lambda x: 'Ch' if 'Charles' in x else x) 
Смежные вопросы