Один из столбцов в моих кадрах данных - это имена идентификаторов с определенным соглашением об именах. Когда он был перепутан, он не был введен правильно. Я хотел спросить, как я могу найти определенные ключевые слова для ввода в своем столбце в python. Может быть, какая-то петля?
Пример:
types = ['XYZ', 'OPQ', 'MNO', 'ABC']
текущий df:
ID ID Name
45 I_name_ls_XYZ_random
46 I_22_name_ABC_random
47 I_name_ls_XYZ_random_45
48 I_name_ls_MNO_random
49 I_ls_OPQ_random_name
50 I_name_ls_ABC_random
51 I_name_ls_XYZ_random
52 I_name_MNO_random
Требуемый результат:
ID ID Name types
45 I_name_ls_XYZ_random XYZ
46 I_22_name_ABC_random ABC
47 I_name_ls_XYZ_random_45 XYZ
48 I_name_ls_MNO_random MNO
49 I_ls_OPQ_random_name OPQ
50 I_name_ls_ABC_random ABC
51 I_name_ls_XYZ_random XYZ
52 I_name_MNO_random MNO
Спасибо
Используя pd.Series.apply
с пользовательским выражением функции/генератора:
types = {'XYZ', 'OPQ', 'MNO', 'ABC'}
def string_filter(x):
return next((i for i in x.split('_') if i in types), None)
df['types'] = df['ID_Name'].apply(string_filter)
print(df)
ID ID_Name types
0 45 I_name_ls_XYZ_random XYZ
1 46 I_22_name_ABC_random ABC
2 47 I_name_ls_XYZ_random_45 XYZ
3 48 I_name_ls_MNO_random MNO
4 49 I_ls_OPQ_random_name OPQ
5 50 I_name_ls_ABC_random ABC
6 51 I_name_ls_XYZ_random XYZ
7 52 I_name_MNO_random MNO
Использование str.extract
df['types'] = df.Name.str.extract('({})'.format('|'.join(types)))
ID Name types
0 45 I_name_ls_XYZ_random XYZ
1 46 I_22_name_ABC_random ABC
2 47 I_name_ls_XYZ_random_45 XYZ
3 48 I_name_ls_MNO_random MNO
4 49 I_ls_OPQ_random_name OPQ
5 50 I_name_ls_ABC_random ABC
6 51 I_name_ls_XYZ_random XYZ
7 52 I_name_MNO_random MNO
Если вам нужно несколько совпадений, вы можете использовать findall
df
ID Name
0 45 I_name_ls_XYZ_ABCrandom
df.Name.str.findall(r'|'.join(types))
0 [XYZ, ABC]
Name: Name, dtype: object