Python Pandas - Iterazione
Il comportamento dell'iterazione di base sugli oggetti Pandas dipende dal tipo. Quando si esegue l'iterazione su una serie, viene considerata come un array e l'iterazione di base produce i valori. Altre strutture dati, come DataFrame e Panel, seguono ildict-like convenzione di iterazione su keys degli oggetti.
In breve, iterazione di base (per i in oggetto) produce -
Series - valori
DataFrame - etichette di colonna
Panel - etichette degli articoli
Iterazione di un DataFrame
L'iterazione di un DataFrame fornisce i nomi delle colonne. Consideriamo il seguente esempio per capire lo stesso.
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
Suo output è il seguente -
A
C
D
x
y
Per iterare sulle righe del DataFrame, possiamo utilizzare le seguenti funzioni:
iteritems() - per scorrere le coppie (chiave, valore)
iterrows() - itera sulle righe come coppie (indice, serie)
itertuples() - itera sulle righe come namedtuples
iteritems ()
Itera su ogni colonna come chiave, coppia di valori con etichetta come chiave e valore di colonna come oggetto Series.
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
Suo output è il seguente -
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
Osserva, ogni colonna viene iterata separatamente come coppia chiave-valore in una serie.
iterrows ()
iterrows () restituisce l'iteratore che restituisce ogni valore di indice insieme a una serie contenente i dati in ogni riga.
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
Suo output è il seguente -
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 - Perche ' iterrows()itera sulle righe, non conserva il tipo di dati su tutta la riga. 0,1,2 sono gli indici di riga e col1, col2, col3 sono gli indici di colonna.
itertuples ()
Il metodo itertuples () restituirà un iteratore che restituisce una tupla con nome per ogni riga nel DataFrame. Il primo elemento della tupla sarà il valore di indice corrispondente della riga, mentre i valori rimanenti sono i valori di riga.
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
Suo output è il seguente -
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- Non provare a modificare alcun oggetto durante l'iterazione. L'iterazione è intesa per la lettura e l'iteratore restituisce una copia dell'oggetto originale (una vista), quindi le modifiche non si rifletteranno sull'oggetto originale.
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
Suo output è il seguente -
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
Osserva, nessun cambiamento si riflette.