Применить разбиение на основе определенного условия - PullRequest
1 голос
/ 25 февраля 2020

У меня есть следующий фрейм данных:

data = {'Name': ['Peter | Jacker', 'John | Parcker', 'Paul | Cash', 'Tony'],
        'Age': [10, 45, 14, 65]}
df = pd.DataFrame(data)

Что я хочу извлечь - это псевдонимы (слово после символа '|') только для человека, у которого более 16 лет. Для этого я использую следующий код:

df['nickname'] = df.apply(lambda x: x.str.split('|', 1)[-1] if x['Age'] > 16 else 0, axis=1)

Однако, когда я печатаю никнейм, я получаю только следующие результаты:

     Name      Age  nickname
Peter | Jacker  10   0.0     
John | Parcker  45  NaN      
Paul | Cash     14   0.0     
Tony            65  NaN  

И что я хочу, это:

     Name      Age  nickname
Peter | Jacker  10   NaN    
John | Parcker  45   Parcker      
Paul | Cash     14   NaN     
Tony            65   NaN 

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2020

Используйте numpy.where с выбором вторых списков после split, если условие соответствует, иначе добавьте значения запотевания (или 0, что нужно):

df['nickname'] = np.where(df['Age'] > 16, df['Name'].str.split('|', 1).str[1] , np.nan)
print (df)
             Name  Age  nickname
0  Peter | Jacker   10       NaN
1  John | Parcker   45   Parcker
2     Paul | Cash   14       NaN
3            Tony   65       NaN
0 голосов
/ 25 февраля 2020

Применение функции разделения на столбце имени. Попробуйте следующий код:

import numpy as np

df.apply(lambda x: x['Name'].split('|', 1)[-1] if x['Age'] > 16 and len(x['Name'].split('|',1))>1 else np.nan, axis=1)

             Name  Age  nickname
0  Peter | Jacker   10       NaN
1  John | Parcker   45   Parcker
2     Paul | Cash   14       NaN
3            Tony   65       NaN

...