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

C

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.

 

About the author

Ramiro de la Vega

Bienvenido a Pharos.sh

Soy Ramiro de la Vega, Estadounidense con raíces Españolas. Empecé a programar hace casi 20 años cuando era muy jovencito.

Espero que en mi web encuentres la inspiración y ayuda que necesitas para adentrarte en el fantástico mundo de la programación y conseguir tus objetivos por difíciles que sean.

1 comment

  • Gracias por los tutoriales que cuelgas, llevo un tiempo siguiendo tu blog y es magnífico. Contenido con calidad, muy bien presentado, yendo al grano. Es perfecto. Mejor que muchos canales de youtube.

Sobre mi

Últimos Post

Etiquetas

Esta web utiliza cookies propias para su correcto funcionamiento. Al hacer clic en el botón Aceptar, aceptas el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad