Autor Tema: Usar str.contains en pandas

0 Usuarios y 1 Visitante están viendo este tema.

07 Enero, 2022, 05:21 pm
Leído 463 veces

MeFon

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 15
  • País: co
  • Karma: +0/-0
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  ;)

07 Enero, 2022, 08:42 pm
Respuesta #1

geómetracat

  • Moderador Global
  • Mensajes: 3,189
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
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)
La ecuación más bonita de las matemáticas: \( d^2=0 \)

07 Enero, 2022, 11:31 pm
Respuesta #2

MeFon

  • $$\Large \color{#6a84c0}\pi$$
  • Mensajes: 15
  • País: co
  • Karma: +0/-0
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

08 Enero, 2022, 04:18 am
Respuesta #3

ingmarov

  • Moderador Global
  • Mensajes: 5,320
  • País: hn
  • Karma: +0/-0
  • Sexo: Masculino
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
No te confíes, revisa lo que escribo. Yo también me equivoco.
Odio el autocorrector de Android...

08 Enero, 2022, 03:13 pm
Respuesta #4

geómetracat

  • Moderador Global
  • Mensajes: 3,189
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
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])
La ecuación más bonita de las matemáticas: \( d^2=0 \)