Python Pandas - Iteración

El comportamiento de la iteración básica sobre los objetos Pandas depende del tipo. Cuando se itera sobre una serie, se considera como una matriz y la iteración básica produce los valores. Otras estructuras de datos, como DataFrame y Panel, siguen lasdict-like convención de iterar sobre el keys de los objetos.

En resumen, iteración básica (para i en objeto) produce -

  • Series - valores

  • DataFrame - etiquetas de columna

  • Panel - etiquetas de artículos

Iterando un DataFrame

La iteración de un DataFrame da nombres de columna. Consideremos el siguiente ejemplo para entender lo mismo.

import pandas as pd
import numpy as np
 
N=20
df = pd.DataFrame({
   'A': pd.date_range(start='2016-01-01',periods=N,freq='D'),
   'x': np.linspace(0,stop=N-1,num=N),
   'y': np.random.rand(N),
   'C': np.random.choice(['Low','Medium','High'],N).tolist(),
   'D': np.random.normal(100, 10, size=(N)).tolist()
   })

for col in df:
   print col

Sus output es como sigue -

A
C
D
x
y

Para iterar sobre las filas del DataFrame, podemos usar las siguientes funciones:

  • iteritems() - iterar sobre los pares (clave, valor)

  • iterrows() - iterar sobre las filas como pares (índice, serie)

  • itertuples() - iterar sobre las filas como nombres de tuplas

iteritems ()

Itera sobre cada columna como clave, par de valores con etiqueta como clave y valor de columna como un objeto Serie.

import pandas as pd
import numpy as np
 
df = pd.DataFrame(np.random.randn(4,3),columns=['col1','col2','col3'])
for key,value in df.iteritems():
   print key,value

Sus output es como sigue -

col1 0    0.802390
1    0.324060
2    0.256811
3    0.839186
Name: col1, dtype: float64

col2 0    1.624313
1   -1.033582
2    1.796663
3    1.856277
Name: col2, dtype: float64

col3 0   -0.022142
1   -0.230820
2    1.160691
3   -0.830279
Name: col3, dtype: float64

Observe, cada columna se itera por separado como un par clave-valor en una serie.

iterrows ()

iterrows () devuelve el iterador que produce cada valor de índice junto con una serie que contiene los datos en cada fila.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for row_index,row in df.iterrows():
   print row_index,row

Sus output es como sigue -

0  col1    1.529759
   col2    0.762811
   col3   -0.634691
Name: 0, dtype: float64

1  col1   -0.944087
   col2    1.420919
   col3   -0.507895
Name: 1, dtype: float64
 
2  col1   -0.077287
   col2   -0.858556
   col3   -0.663385
Name: 2, dtype: float64
3  col1    -1.638578
   col2     0.059866
   col3     0.493482
Name: 3, dtype: float64

Note Porque iterrows()iterar sobre las filas, no conserva el tipo de datos en la fila. 0,1,2 son los índices de fila y col1, col2, col3 son índices de columna.

itertuples ()

El método itertuples () devolverá un iterador que producirá una tupla con nombre para cada fila del DataFrame. El primer elemento de la tupla será el valor de índice correspondiente de la fila, mientras que los valores restantes son los valores de la fila.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])
for row in df.itertuples():
    print row

Sus output es como sigue -

Pandas(Index=0, col1=1.5297586201375899, col2=0.76281127433814944, col3=-
0.6346908238310438)

Pandas(Index=1, col1=-0.94408735763808649, col2=1.4209186418359423, col3=-
0.50789517967096232)

Pandas(Index=2, col1=-0.07728664756791935, col2=-0.85855574139699076, col3=-
0.6633852507207626)

Pandas(Index=3, col1=0.65734942534106289, col2=-0.95057710432604969,
col3=0.80344487462316527)

Note- No intente modificar ningún objeto durante la iteración. La iteración está destinada a la lectura y el iterador devuelve una copia del objeto original (una vista), por lo que los cambios no se reflejarán en el objeto original.

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4,3),columns = ['col1','col2','col3'])

for index, row in df.iterrows():
   row['a'] = 10
print df

Sus output es como sigue -

col1       col2       col3
0  -1.739815   0.735595  -0.295589
1   0.635485   0.106803   1.527922
2  -0.939064   0.547095   0.038585
3  -1.016509  -0.116580  -0.523158

Observe, no se reflejan cambios.