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.