es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Filtrar columnas del dataframe de Pandas mediante coincidencia de subcadena.

Tengo un dataframe con varias columnas, por ejemplo:

 Name  Age   Fname

0 Alex 10 Alice
1 Bob 12 Bob
2 Clarke 13 clarke

Mi condición de filtro es verificar si “Name” es una subcadena (sin distinguir mayúsculas y minúsculas) de “Fname” correspondiente.

Si fuera una igualdad, algo tan simple como:

df[df[“Name”].str.lower() == df[“Fname”].str.lower()]

funcionaría. Sin embargo, quiero una coincidencia de subcadena, así que en lugar de “==”, pensé que “in” funcionaría. Pero eso da un error ya que interpreta uno de los argumentos como pd.Series. Mi primera pregunta es ¿Por qué esta diferencia en la interpretación?

Otra forma que intenté fue usando “.str.contains”:

df[df[“Fname”].str.contains(df[“Name”], case=False)]

que también interpreta df[“Name”] como pd.Series y, por supuesto, funciona con una cadena constante en el argumento.

Por ejemplo, esto funciona:
df[df[“Fname”].str.contains(“a”, case=False)]

Quiero resolver esta situación, por lo que cualquier ayuda en ese sentido es apreciada.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    En cuanto a la primera pregunta, la razón de la diferencia en la interpretación es que cuando se utiliza ==, la comparación se realiza elemento por elemento entre las dos series. Sin embargo, cuando se utiliza in, la serie del lado derecho se interpreta como un único valor, en lugar de una secuencia de valores.

    En cuanto a la segunda pregunta, puedes utilizar apply para aplicar una función a cada fila del DataFrame, que verifica si el valor de Name es una subcadena del valor correspondiente de Fname. Aquí tienes un ejemplo:

    df[df.apply(lambda x: x['Name'].lower() in x['Fname'].lower(), axis=1)]
    

    Esto aplica una función lambda a cada fila del DataFrame, que verifica si el valor de Name en minúsculas es una subcadena del valor de Fname en minúsculas. El argumento axis=1 le indica a apply que aplique la función a cada fila, en lugar de cada columna.

    Esto debería darte el resultado deseado de filtrar el DataFrame para mantener solo las filas donde Name es una subcadena de Fname.

Comments are closed.