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:

    Te puede interesar:Leer y escribir tablas HTML con Pandas
    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.

    Te puede interesar:Usando __slots__ para almacenar datos de objetos en Python

    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.

    Te puede interesar:Cambiar el tamaño de la figura en Matplotlib

    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:

    Te puede interesar:Guardar trazado como imagen con Matplotlib
    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:

    Te puede interesar:Agregar leyenda a la figura en Matplotlib
    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.

    Te puede interesar:Diagrama de dispersión de Matplotlib: tutorial y ejemplos

    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í:

    Te puede interesar:Diagrama de dispersión de Seaborn – Tutorial y ejemplos
    Pandas(Index='id001', first_name="John", last_name="Smith", age=34)
    

    Aquí están los resultados promedio en segundos:

    Método Velocidad (s) Función de prueba
    artículos() 1.349279541666571 impresión()
    iterrows () 3.4104003086661883 impresión()
    itertuples () 0.41232967500279 impresión()
    Método Velocidad (s) Función de prueba
    artículos() 0,006637570998767235 adjuntar()
    iterrows () 0.5749766406661365 adjuntar()
    itertuples () 0.3058610513350383 adjuntar()

    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.

     

    Rate this post

    Etiquetas: