Как использовать сочетание регулярного и точного литерального соответствия для получения значения индекса - PullRequest
1 голос
/ 05 июня 2019

У меня есть датафрейм, который можно создать из приведенного ниже кода

 df2= pd.DataFrame({'level_0': ['No case 
 notes','Notes','1.Chinese','2.Widowed','No']})

Это выглядит так, как показано ниже

enter image description here

У меня также есть список ввода, который приведен ниже

input_terms = ['No','Widowed','Chinese']

Я хотел бы найти эти термины в кадре данных и получить их индекс.

Как мне сделать так, чтобы мой вывод был таким

[4,3,2] - # Это список выходных индексов из фрейма данных для моих входных терминов

Как вы можете видеть, я не хочу, чтобы набор результатов включал в себя термины «Нет заметок по делу», «Примечания», хотя они содержат «Нет» как часть своей строки - Здесь я делаю точное совпадение

Но для входных терминов 'Chinese' и 'Widowed' я хочу, чтобы набор результатов включал '1.Chinese' и '2.Widowed' - Здесь меня интересует что-то вроде метода str.contains

Как я могу применить сочетание точного и регулярного / str.contains подхода для поиска строки?

Ответы [ 2 ]

2 голосов
/ 05 июня 2019

Попробуйте это регулярное выражение:

^[^a-zA-Z]*XXX[^a-zA-Z]*$

замените XXX поисковыми терминами (не забудьте их избежать!).Например:

^[^a-zA-Z]*(?:Chinese|No|Widowed)[^a-zA-Z]*$

Это своего рода смесь между str.contains и точными совпадениями.Он будет в основном игнорировать определенные символы (в данном случае, все, что не является a-zA-Z) и выполнит точное совпадение.Если вы хотите игнорировать другой набор символов, просто измените два класса символов на двух концах.Например, если вы также хотите игнорировать пробелы:

^[^a-zA-Z\s]*XXX[^a-zA-Z\s]*$
2 голосов
/ 05 июня 2019

Если порядок значений индекса не важен:

df2= pd.DataFrame({'level_0': ['No case notes','notes','1.Chinese','2.Widowed','No']})

input_terms = ['No','Widowed','Chinese']

pat = '|'.join(r"\d+\.{}$".format(x) for x in input_terms)
m1 = df2['level_0'].str.contains(pat)
m2 = df2['level_0'].isin(input_terms)

idx = df2.index[m1 | m2]
print (idx)
Int64Index([2, 3, 4], dtype='int64')

Если порядок важен:

input_terms = ['No','Widowed','Chinese']

out = []
for x in input_terms:
    a = df2.index[df2['level_0'] == x]
    b = df2.index[df2['level_0'].str.contains(r'\d+\.{}$'.format(x))]

print (out)
[4, 3, 2]
...