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.