TransWikia.com

como iterar fila por fila en pandas

Stack Overflow en español Asked by Emanuel Lemos on November 4, 2021

como puedo iterar fila por fila en un dataframe usando python:
por ejemplo , tengo el siguiente data:

canciones={'albun':['cacho','beto','pedrito','loshermanos'],
       'ano':[1992,1998,1994,1993],
       'tiempo':['00:22:04','00:42:02','00:23:33','00:44:33']}

ahora yo quiero saber como hacer para iterar la fila 1 o tal vez la 2 o tal vez 1 y dos:

  for i en fila 1:
     if fila 1 elemento 1(osea la de la columna 1 y despues hasta columna n) es > 20:
            guardame en ese espacio ('no')
     elif:
        si es <20 y >10:
         guardame en ese espacio ('si')
     else
     dejalo como esta

y tal vez no solo agarrando una fila sino la fila 10 , 20 , 40
gracias espero me puedan ayudar

One Answer

A partir del ejemplo que propones no se entiende bien lo que pretendes, pues comienzas mostrando un diccionario cuyos datos son cadenas, o años, o duraciones de tiempo, pero después planteas un pseudocódigo en el que iteras por filas (¿cuál sería el dataframe? Entiendo que el creado a partir del diccionario) y haces operaciones numéricas, comparando con 20, 10 y cosas similares que no aparecen entre tus datos.

En cualquier caso te indico que Pandas está diseñado para que no tengas que iterar prácticamente nunca, pues proporciona métodos de muy alto nivel para operar "a la vez" con todos los elementos de una columna o de un dataframe. En realidad, obviamente, pandas deberá iterar en bucle por los elementos del dataframe para lograr esa funcionalidad, pero te ahorra el tener que hacerlo tú. En muchas ocasiones una sola línea de código hace lo que necesitas.

Ya que tu ejemplo no se entiende muy bien, propongo otro. Crearé un dataframe con números aleatorios que siguen una distribución normal:

import pandas as pd
import numpy as np

def numeros():
  return np.random.randn(10)

df = pd.DataFrame({"c1": numeros(), "c2": numeros(), "c3": numeros()})
print(df)

Que daría este resultado:

         c1        c2        c3
0  0.933062 -0.331660  0.570088
1 -1.056521  0.653821 -0.715223
2  0.415285  0.580467  0.275368
3  0.603351  1.259974  1.532510
4 -1.494285 -1.446740  1.590340
5 -0.462880  0.657413 -0.086055
6 -1.243113 -0.016631 -0.451884
7  0.968619 -0.729009  0.176846
8 -0.756221  0.502987  0.573067
9  1.079186 -1.599314  1.275140

Ahora supongamos que quiero cambiar todos los negativos por la palabra "no", y de los positivos cambiar por la palabra "si" aquellos que sean menores de 1.

Comienzo por escribir una función que haga esa "transformación" a un solo dato que recibe como parámetro, retornándome el resultado de esa transformación. Tan simple como esto:

def transformar(n):
  if n<0:
    return "no"
  if n<1:
    return "si"
  return n

Y ahora es cuando la potencia de Pandas entra en juego. Usando su método applymap() puede aplicar esa función a todos los elementos del dataframe, en una sola línea y sin escribir bucles:

resultado = df.applymap(transformar)
print(resultado)

Y sale:

        c1       c2       c3
0       si       no       si
1       no       si       no
2       si       si       si
3       si  1.25997  1.53251
4       no       no  1.59034
5       no       si       no
6       no       no       no
7       si       no       si
8       no       si       si
9  1.07919       no  1.27514

Esta forma de trabajar no sólo te permite escribir menos código, sino que además es mucho más eficiente, pues los bucles que internamente usa Pandas para recorrer los datos están implementados en C y se ejecutan mucho más rápido que los bucles python que tú pretendías.

Si usas funciones lambda puedes ahorrarte escribir la función transformar, pero creo que queda más legible en este caso usar una función externa. Por referencia, con lambda quedaría así:

df.applymap(lambda n: "no" if n<0 else "si" if n<1 else x)

Answered by abulafia on November 4, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP