C贸mo iterar sobre filas en un marco de datos de Pandas

    Introducci贸n

    Pandas es un marco de manipulaci贸n de datos inmensamente popular para Python. En muchos casos, es posible que desee iterar sobre los datos, ya sea para imprimirlos o realizar algunas operaciones en ellos.

    En este tutorial, veremos c贸mo iterar sobre filas en un Pandas DataFrame.

    Si eres nuevo en Pandas, puedes leer nuestro tutorial para principiantes. Una vez que est茅 familiarizado, veamos las tres formas principales de iterar sobre DataFrame:

    • items()
    • iterrows()
    • itertuples()

    Iterando DataFrames con elementos ()

    Vamos a configurar un DataFrame con algunos datos de personas ficticias:

    import pandas as pd
    
    df = pd.DataFrame({
        'first_name': ['John', 'Jane', 'Marry', 'Victoria', 'Gabriel', 'Layla'],
        'last_name': ['Smith', 'Doe', 'Jackson', 'Smith', 'Brown', 'Martinez'],
        'age': [34, 29, 37, 52, 26, 32]},
        index=['id001', 'id002', 'id003', 'id004', 'id005', 'id006'])
    

    Tenga en cuenta que estamos usando id como nuestro DataFrame铆ndice de. Echemos un vistazo a c贸mo DataFrame parece:

    print(df.to_string())
    
          first_name last_name  age
    id001       John     Smith   34
    id002       Jane       Doe   29
    id003      Marry   Jackson   37
    id004   Victoria     Smith   52
    id005    Gabriel     Brown   26
    id006      Layla  Martinez   32
    

    Ahora, para iterar sobre esto DataFrame, usaremos el items() funci贸n:

    df.items()
    

    Esto devuelve un generador:

    <generator object DataFrame.items at 0x7f3c064c1900>
    

    Podemos usar esto para generar pares de col_name y data. Estos pares contendr谩n un nombre de columna y cada fila de datos para esa columna. Repasemos los nombres de las columnas y sus datos:

    for col_name, data in df.items():
    	print("col_name:",col_name, "ndata:",data)
    

    Esto resulta en:

    col_name: first_name
    data: 
    id001        John
    id002        Jane
    id003       Marry
    id004    Victoria
    id005     Gabriel
    id006       Layla
    Name: first_name, dtype: object
    col_name: last_name
    data: 
    id001       Smith
    id002         Doe
    id003     Jackson
    id004       Smith
    id005       Brown
    id006    Martinez
    Name: last_name, dtype: object
    col_name: age
    data: 
    id001    34
    id002    29
    id003    37
    id004    52
    id005    26
    id006    32
    Name: age, dtype: int64
    

    Hemos iterado con 茅xito en todas las filas de cada columna. Observe que la columna de 铆ndice permanece igual durante la iteraci贸n, ya que este es el 铆ndice asociado para los valores. Si no define un 铆ndice, Pandas enumerar谩 la columna del 铆ndice en consecuencia.

    Tambi茅n podemos imprimir una fila en particular pasando el n煤mero de 铆ndice al data como hacemos con las listas de Python:

    for col_name, data in df.items():
    	print("col_name:",col_name, "ndata:",data[1])
    

    Tenga en cuenta que el 铆ndice de lista est谩 indexado a cero, por lo que data[1] se referir铆a a la segunda fila. Ver谩 esta salida:

    col_name: first_name 
    data: Jane
    col_name: last_name 
    data: Doe
    col_name: age 
    data: 29
    

    Tambi茅n podemos pasar el valor del 铆ndice a data.

    for col_name, data in df.items():
    	print("col_name:",col_name, "ndata:",data['id002'])
    

    La salida ser铆a la misma que antes:

    col_name: first_name
    data: Jane
    col_name: last_name
    data: Doe
    col_name: age
    data: 29
    

    Iterando DataFrames con iterrows ()

    Mientras df.items() itera sobre las filas en columnas, haciendo un ciclo para cada columna, podemos usar iterrows() para obtener toda la fila de datos de un 铆ndice.

    Intentemos iterar sobre las filas con iterrows():

    for i, row in df.iterrows():
    	print(f"Index: {i}")
    	print(f"{row}n")
    

    En el bucle for, i representa la columna de 铆ndice (nuestro DataFrame tiene 铆ndices de id001 a id006) y row contiene los datos de ese 铆ndice en todas las columnas. Nuestra salida se ver铆a as铆:

    Index: id001
    first_name     John
    last_name     Smith
    age              34
    Name: id001, dtype: object
    
    Index: id002
    first_name    Jane
    last_name      Doe
    age             29
    Name: id002, dtype: object
    
    Index: id003
    first_name      Marry
    last_name     Jackson
    age                37
    Name: id003, dtype: object
    
    ...
    

    Asimismo, podemos iterar sobre las filas de una determinada columna. Simplemente pasando el n煤mero de 铆ndice o el nombre de la columna al row. Por ejemplo, podemos imprimir selectivamente la primera columna de la fila as铆:

    for i, row in df.iterrows():
    	print(f"Index: {i}")
    	print(f"{row['0']}")
    

    O:

    for i, row in df.iterrows():
    	print(f"Index: {i}")
    	print(f"{row['first_name']}")
    

    Ambos producen esta salida:

    Index: id001
    John
    Index: id002
    Jane
    Index: id003
    Marry
    Index: id004
    Victoria
    Index: id005
    Gabriel
    Index: id006
    Layla
    

    Iterando DataFrames con itertuples ()

    los itertuples() La funci贸n tambi茅n devolver谩 un generador, que genera valores de fila en tuplas. Probemos esto:

    for row in df.itertuples():
        print(row)
    

    Ver谩s esto en tu shell de Python:

    Pandas(Index='id001', first_name="John", last_name="Smith", age=34)
    Pandas(Index='id002', first_name="Jane", last_name="Doe", age=29)
    Pandas(Index='id003', first_name="Marry", last_name="Jackson", age=37)
    Pandas(Index='id004', first_name="Victoria", last_name="Smith", age=52)
    Pandas(Index='id005', first_name="Gabriel", last_name="Brown", age=26)
    Pandas(Index='id006', first_name="Layla", last_name="Martinez", age=32)
    

    los itertuples() El m茅todo tiene dos argumentos: index y name.

    Podemos elegir no mostrar la columna de 铆ndice configurando el index par谩metro a False:

    for row in df.itertuples(index=False):
        print(row)
    

    Nuestras tuplas ya no mostrar谩n el 铆ndice:

    Pandas(first_name="John", last_name="Smith", age=34)
    Pandas(first_name="Jane", last_name="Doe", age=29)
    Pandas(first_name="Marry", last_name="Jackson", age=37)
    Pandas(first_name="Victoria", last_name="Smith", age=52)
    Pandas(first_name="Gabriel", last_name="Brown", age=26)
    Pandas(first_name="Layla", last_name="Martinez", age=32)
    

    Como ya ha notado, este generador produce namedtuples con el nombre predeterminado de Pandas. Podemos cambiar esto pasando People argumento a la name par谩metro. Puede elegir el nombre que desee, pero siempre es mejor elegir nombres relevantes para sus datos:

    for row in df.itertuples(index=False, name="People"):
        print(row)
    

    Ahora nuestra salida ser铆a:

    People(first_name="John", last_name="Smith", age=34)
    People(first_name="Jane", last_name="Doe", age=29)
    People(first_name="Marry", last_name="Jackson", age=37)
    People(first_name="Victoria", last_name="Smith", age=52)
    People(first_name="Gabriel", last_name="Brown", age=26)
    People(first_name="Layla", last_name="Martinez", age=32)
    

    Rendimiento de iteraci贸n con pandas

    los documentaci贸n oficial de Pandas advierte que la iteraci贸n es un proceso lento. Si est谩 iterando sobre un DataFrame para modificar los datos, la vectorizaci贸n ser铆a una alternativa m谩s r谩pida. Adem谩s, se desaconseja modificar los datos mientras se itera sobre las filas, ya que Pandas a veces devuelve una copia de los datos en la fila y no su referencia, lo que significa que no todos los datos se cambiar谩n realmente.

    Para peque帽os conjuntos de datos, puede utilizar el to_string() m茅todo para mostrar todos los datos. Para conjuntos de datos m谩s grandes que tienen muchas columnas y filas, puede usar head(n) o tail(n) m茅todos para imprimir la primera n filas de su DataFrame (el valor predeterminado para n es 5).

    Comparaci贸n de velocidad

    Para medir la velocidad de cada m茅todo en particular, los agrupamos en funciones que los ejecutar铆an 1000 veces y devolver铆an el tiempo promedio de ejecuci贸n.

    Para probar estos m茅todos, usaremos ambos print() y list.append() funciones para proporcionar mejores datos de comparaci贸n y cubrir casos de uso comunes. Para decidir un ganador justo, iteraremos sobre DataFrame y usaremos solo 1 valor para imprimir o agregar por ciclo.

    As铆 es como se ven los valores de retorno para cada m茅todo:

    Por ejemplo, mientras items() ciclar铆a columna por columna:

    ('first_name', 
    id001        John
    id002        Jane
    id003       Marry
    id004    Victoria
    id005     Gabriel
    id006       Layla
    Name: first_name, dtype: object)
    

    iterrows() proporcionar铆a todos los datos de la columna para una fila en particular:

    ('id001', 
    first_name     John
    last_name     Smith
    age              34
    Name: id001, dtype: object)
    

    Y finalmente, una sola fila para el itertuples() se ver铆a as铆:

    Pandas(Index='id001', first_name="John", last_name="Smith", age=34)
    

    Aqu铆 est谩n los resultados promedio en segundos:

    M茅todoVelocidad (s)Funci贸n de prueba
    art铆culos()1.349279541666571impresi贸n()
    iterrows ()3.4104003086661883impresi贸n()
    itertuples ()0.41232967500279impresi贸n()
    M茅todoVelocidad (s)Funci贸n de prueba
    art铆culos()0,006637570998767235adjuntar()
    iterrows ()0.5749766406661365adjuntar()
    itertuples ()0.3058610513350383adjuntar()

    Imprimir valores tomar谩 m谩s tiempo y recursos que agregarlos en general y nuestros ejemplos no son una excepci贸n. Mientras itertuples() funciona mejor cuando se combina con print(), items() m茅todo supera a otros dram谩ticamente cuando se utiliza para append() y iterrows() sigue siendo el 煤ltimo para cada comparaci贸n.

    Tenga en cuenta que los resultados de estas pruebas dependen en gran medida de otros factores como el sistema operativo, el entorno, los recursos inform谩ticos, etc. El tama帽o de sus datos tambi茅n tendr谩 un impacto en sus resultados.

    Conclusi贸n

    Hemos aprendido a iterar sobre el DataFrame con tres m茅todos diferentes de Pandas: items(), iterrows(), itertuples(). Dependiendo de tus datos y preferencias puedes utilizar uno de ellos en tus proyectos.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *