Filtrado de DataFrame buscando la palabra exacta (no combinada) en una columna de cadenas

Mi DataFrame tiene dos columnas:

Name Status a I am Good b Goodness!!! c Good is what i feel d Not Good-at-all 

Quiero filtrar las filas en las que Status tiene una cadena “Buena” como su palabra exacta, no combinada con ninguna otra palabra o carácter.

Así que la salida será:

 Name Status ai am Good c Good is what i feel 

Otras dos filas tenían una cadena ‘Buena’, pero se mezclaban con otros caracteres, por lo que no deberían recogerse.

Intenté hacer:

 d = df[df['Status'].str.contains('Good')] # But all rows come up 

Creo que algunas expresiones regulares como (r'\bGood\b', Status) harán eso, pero esto no es capaz de resumirlas juntas. ¿Y cómo / dónde exactamente puedo ajustar la expresión regular en una condición de filtro DataFrame para lograr esto? ¿Y cómo lograr los startswith o ” endswith ” (búsqueda exacta de palabras)?

Si está definiendo “exacto” para que no signifique ningún otro carácter (incluida la puntuación que define el límite de una palabra \b ), en su lugar, puede verificar si hay un espacio al principio y al final y / o los anclajes de inicio / final:

 >>> df[df['Status'].str.contains(r'(?:\s|^)Good(?:\s|$)')] Name Status 0 a I am Good 2 c Good is what i feel 

Explicación:

  • (?:\s|^) es un grupo sin captura que busca un carácter de espacio ( \s ) o el principio de la cadena ( ^ ).

  • Good es la palabra que estás buscando.

  • (?:\s|$) es un grupo no capturador que busca un carácter de espacio ( \s ) o el final de la cadena ( $ ).