2017-02-07 2 views
0

У меня была задача извлечения имя электронной почты из FULLNAME, как показано ниже (и мой код, чтобы иметь дело с ним)Эффективный способ получить имя электронной почты

list_=['peter mary','peter mary david ','pop david','peter pop ronaldo bulma'] 
sr=pd.Series(list_,range(4)) 
sr_split=sr.str.split() 
first_name=sr_split.str[-1] 
other_name=sr_split.str[0:-1] 
other_name=other_name.str.join(' ') 
other_=other_name.str.split(expand=True) 
other_.fillna(' ',inplace=True) 
add_name=other_[0].str[0]+other_[1].str[0]+other_[2].str[0] 
email_name=pd.concat([first_name,add_name],axis=1) 
email_name[2]=email_name[0]+email_name[1] 

Мой код возвращаемый:

maryp, davidpm,davidp,bulmappr 

It работал как мой expectation.However, есть 2 проблемы с моим кодом: 1) Используйте много раскола и присоединиться к 2) не может работать с длинным названием, скажем: имя 10 слов

Это способ сделать это лучше?

+0

Вы должны добавить пример того, что код должен делать в общем случае. –

ответ

0

Это должно быть сделано.

list_=['peter mary','peter mary david ','pop david','peter pop ronaldo bulma'] 


def mk_email_name(x): 
    #get names 
    names = x.split(' ') 
    if len(names) == 1: 
     return x 
    else: 
     #get first name 
     fn = names[0] 
     #get last_names 
     lns = ''.join(map(lambda y:y[:1], names[1:])) 
    email = '%s%s' % (fn, lns) 
    return email 


#apply without pandas 
print map(mk_email_name, list_) 
# ['peterm', 'petermd', 'popd', 'peterprb'] 
#apply on pandas df 
df = pd.DataFrame(list_, columns=['full_name']) 
df['email'] = df.full_name.apply(mk_email_name) 
1

Как насчет использования применяемых и строковых методов?

In [469]: (sr.str.strip().str.split(' ') 
      .apply(lambda x: x[-1] + ''.join([y[0] for y in x[:-1]])) 
     ) 
Out[469]: 
0  maryp 
1  davidpm 
2  davidp 
3 bulmappr 
dtype: object 
+0

вместо 'str.split ('')' возможно использовать 'str.split()' – jezrael

+0

Tks много. Ваш код потрясающе красив. Как не-программист, мои знания о цикле очень ограничены – ducvu169

Смежные вопросы