Comment itérer sur les lignes d'un DataFrame dans Pandas ?

J'ai un DataFrame de pandas :

import pandas as pd
inp = [{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}]
df = pd.DataFrame(inp)
print df

Sortie :

   c1   c2
0  10  100
1  11  110
2  12  120

Maintenant, je veux itérer sur les lignes de ce cadre. Pour chaque ligne, je veux pouvoir accéder à ses éléments (valeurs dans les cellules) par le nom des colonnes. Par exemple :

for row in df.rows:
   print row['c1'], row['c2']

Est-il possible de faire cela dans pandas ?

J'ai trouvé cette [question similaire][1]. Mais cela ne me donne pas la réponse dont j'ai besoin. Par exemple, il y est suggéré d'utiliser :

for date, row in df.T.iteritems():

ou

for row in df.iterrows():

Mais je ne comprends pas ce qu'est l'objet row et comment je peux travailler avec lui.

[1] : https://stackoverflow.com/questions/7837722/what-is-the-most-efficient-way-to-loop-through-dataframes-with-pandas

Solution

DataFrame.iterrows est un générateur qui produit à la fois l'index et la ligne.

import pandas as pd
import numpy as np

df = pd.DataFrame([{'c1':10, 'c2':100}, {'c1':11,'c2':110}, {'c1':12,'c2':120}])
for index, row in df.iterrows():
    print(row['c1'], row['c2'])

Output: 
   10 100
   11 110
   12 120
Commentaires (7)

Vous devriez utiliser [df.iterrows()][1]. Bien que l'itération ligne par ligne ne soit pas particulièrement efficace puisque les objets Series doivent être créés.

[1] : http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.iterrows.html

Commentaires (3)

Vous pouvez également utiliser df.apply() pour itérer sur les lignes et accéder à plusieurs colonnes pour une fonction.

[docs : DataFrame.apply()] [1]

def valuation_formula(x, y):
    return x * y * 0.5

df['price'] = df.apply(lambda row: valuation_formula(row['x'], row['y']), axis=1)

[1] : http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.html

Commentaires (6)