Фильтрация столбца данных для строк, содержащих определенный текст - PullRequest
0 голосов
/ 09 мая 2019

У меня есть фрейм данных, который содержит определенные столбцы, один из которых - Положение, а другой - Годы обслуживания.Исходя из этого, я хочу создать новую колонку «Life Cover».Я создал эту функцию для этого.

def LifeCover(row):
if row['Years of Service']>5:
    val = 8
elif row['Years of Service']>2 and row['Position'] in ['Associate', 'Director', 'Director of Facilities Management', 'Director of Promise', 'Director, Head of Facilities Management']:
    val = 8
elif row['Years of Service']>2 and row['Position'] not in ['Associate', 'Director', 'Director of Facilities Management', 'Director of Promise', 'Director, Head of Facilities Management']:
    val = 7
else:
    val = 3
return val

df['Potential Life Cover Level'] = df.apply(LifeCover, axis=1)

Это работает, но мне не нравится иметь такой большой список позиций, и оказывается, что список, возможно, тоже должен расти, так что этотакже не практично.

Мне нужно включить / исключить любую позицию, которая содержит слово «Ассоциированный член, директор или партнер».

Мне удалось отфильтровать следующим образом:

target = ['Associate', 'Director', 'Partner']
dfhigh = df[df['Position'].apply(lambda sentence: any(word in sentence for word in target))]
dflow = df[~df['Position'].apply(lambda sentence: any(word in sentence for word in target))]

Итак, я получаю фрейм данных с высокими позициями и один с низкими.

И затем я пытаюсь включить это в свою функцию:

def LifeCover2(row):
if row['Years of Service']>5:
    val = 8
elif row['Years of Service']>2 and row['Position'] in dfhigh['Position']:
    val = 8
elif row['Years of Service']>2 and row['Position'] in dflow['Position']:
    val = 7
else:
    val = 3
return val

Но по какой-то причине этовозвращает только значения 8 или 3.

Я также пробовал это:

def LifeCover2(row):
if row['Years of Service']>5:
    val = 8
elif row['Years of Service']>2 and row['Position'].str.contains('Associate|Director|Partner'):
    val = 8
elif row['Years of Service']>2 and (~row['Position'].str.contains('Associate|Director|Partner')):
    val = 7
else:
    val = 3
return val

, который возвращает AttributeError: ("объект 'str' не имеет атрибута 'str'", 'произошел в индексе69' )

1 Ответ

0 голосов
/ 09 мая 2019

Метод str.contains является векторизованной строковой операцией ( см. Здесь ). Это означает, что это метод для серий панд, а не для строковых типов. Когда вы используете df.apply, pandas пытается использовать str.contains для каждого элемента выбранного вами столбца вместо того, чтобы делать это на уровне Серии.

Я бы предложил следующий подход:

df['LifeCover2'] = 3

df['LifeCover2'] = np.where(df['Years of Service']>5, 8, df['LifeCover2'])

df['LifeCover2'] = np.where((df['Years of Service']>2) & 
                        (df['Position'].str.contains('Associate|Director|Partner')), 8, df['LifeCover2'])

df['LifeCover2'] = np.where((df['Years of Service']>2) & 
                        (~df['Position'].str.contains('Associate|Director|Partner')), 7, df['LifeCover2'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...