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.
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 utilizain
, 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 deName
es una subcadena del valor correspondiente deFname
. Aquí tienes un ejemplo: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 deFname
en minúsculas. El argumentoaxis=1
le indica aapply
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 deFname
.