Rincón Matemático

Disciplinas relacionadas y temas generales => Computación e Informática => Mensaje iniciado por: MeFon en 07 Enero, 2022, 05:21 pm

Título: Usar str.contains en pandas
Publicado por: MeFon en 07 Enero, 2022, 05:21 pm
Hola a todos
Estoy intentando algo en pandas, pero sin resultado.
En la columna Animal hay una lista de nombres de animales, la idea es poder evaluar si esos animales pertenecen a los registros del campo Familia, en caso de pertenecer, se cree una columna que por registro marque True, de no pertenecer, que marque False. Estaba pensando en usar un str.contains pero no sé que argumento debo poner. Algo así
Código: [Seleccionar]
d["Familia"].str.contains("",regex=False)
No sé que argumento poner para que itere cada vez el nombre del animal buscado.
\begin{bmatrix}{Animal}&{Familia}&{Está}\\{Perro}&{Gato|Araña|Perro}&{True}\\{Conejo}&{Gallina|Pato|Caballo}&{False}\end{bmatrix}
Gracias de antemano  ;)
Título: Re: Usar str.contains en pandas
Publicado por: geómetracat en 07 Enero, 2022, 08:42 pm
Lo que propones no funciona porque necesitas información de toda la fila, ya que la nueva columna va a depender de dos columnas antiguas: "Familia" y "Animal".

Una cosa que puedes hacer es lo siguiente:
Código: [Seleccionar]
d["Está"] = d.apply(lambda x: x["Animal"] in x["Familia"], axis=1)
Título: Re: Usar str.contains en pandas
Publicado por: MeFon en 07 Enero, 2022, 11:31 pm
Hola, lo corrí y si funcionó  ;D , pero tengo una pregunta, si quiero evaluar en toda la fila familia que esté el nombre, por ejemplo

    Animal             Familia
0   perro            gato | leon
1   gallina          zorro | oso | vaca
2   oso              oso | gallina | caballo
3   coral            coral | estrella

Oso está dos veces, gallina está en otra fila, quiero que me marque algo como está en fila 2 o algo así. Algo que estaba trabajando es esto:

Código: [Seleccionar]
df= pd.DataFrame(np.array([["perro", "gato | leon"], ["gallina","zorro | oso | vaca"], ["oso", "oso | gallina | caballo"],["coral","coral | estrella"]]),
                   columns=['Animal', 'Familia'])

Código: [Seleccionar]
animal_m=df["Animal"].unique()
for i in range(len(animal_m)):
    a=animal_m[i]
    f=df["Familia"].str.contains(a,regex=False)
    df["Revisión"]=f
    print(df)

Eso me muestra esto
  Animal                  Familia   Está           Revisión
0    perro              gato | leon  False        False
1  gallina       zorro | oso | vaca  False      False
2      oso  oso | gallina | caballo   True      False
3    coral         coral | estrella   True         False
    Animal                  Familia   Está          Revisión
0    perro              gato | leon  False         False
1  gallina       zorro | oso | vaca  False      False
2      oso  oso | gallina | caballo   True      True
3    coral         coral | estrella   True         False
    Animal                  Familia   Está         Revisión
0    perro              gato | leon  False        False
1  gallina       zorro | oso | vaca  False      True
2      oso  oso | gallina | caballo   True      True
3    coral         coral | estrella   True         False
    Animal                  Familia   Está         Revisión
0    perro              gato | leon  False         False
1  gallina       zorro | oso | vaca  False       False
2      oso  oso | gallina | caballo   True      False
3    coral         coral | estrella   True         True

Cómo hago para sacar esos registros y poder usarlos
Título: Re: Usar str.contains en pandas
Publicado por: ingmarov en 08 Enero, 2022, 04:18 am
Hola

Supongo que una forma puede ser que en la columna revisión guardes una lista que contenga el índice de renglones donde aparece la palabra deseada. Deberás buscar la palabra deseada de la columna animal en toda la columna familia.

Saludos
Título: Re: Usar str.contains en pandas
Publicado por: geómetracat en 08 Enero, 2022, 03:13 pm
Siguiendo con la idea de robinlambada, la puedes implementar así (sin usar explícitamente bucles for):
Código: [Seleccionar]
df["Revisión"] = df["Animal"].apply(lambda x: [i for (i,fam) in enumerate(df["Familia"]) if x in fam])