web-dev-qa-db-fra.com

Python Pandas itérer sur les lignes et les noms de colonnes d'accès)

J'essaye de parcourir les lignes d'un Python Pandas dataframe. Dans chaque ligne du dataframe, j'essaie de faire référence à chaque valeur le long d'un ligne par son nom de colonne.

Voici ce que j'ai

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.Rand(10,4),columns=list('ABCD'))
print df
          A         B         C         D
0  0.351741  0.186022  0.238705  0.081457
1  0.950817  0.665594  0.671151  0.730102
2  0.727996  0.442725  0.658816  0.003515
3  0.155604  0.567044  0.943466  0.666576
4  0.056922  0.751562  0.135624  0.597252
5  0.577770  0.995546  0.984923  0.123392
6  0.121061  0.490894  0.134702  0.358296
7  0.895856  0.617628  0.722529  0.794110
8  0.611006  0.328815  0.395859  0.507364
9  0.616169  0.527488  0.186614  0.278792

J'ai utilisé cette approche pour itérer, mais cela ne me donne qu'une partie de la solution - après avoir sélectionné une ligne dans chaque itération, comment puis-je accéder aux éléments de la ligne par leur nom de colonne?

Voici ce que j'essaie de faire:

for row in df.iterrows():
    print row.loc[0,'A']
    print row.A
    print row.index()

D'après ce que je comprends, la ligne est un Pandas série . Mais je n'ai aucun moyen d'indexer dans la série.

Est-il possible d'utiliser des noms de colonne tout en itérant simultanément sur des lignes?

25
edesz

J'aime aussi itertuples()

for row in df.itertuples():
    print(row.A)
    print(row.Index)

puisque row est un tuples nommé, si vous vouliez accéder aux valeurs de chaque ligne, cela devrait être BEAUCOUP PLUS plus rapide

course de vitesse:

df = pd.DataFrame([x for x in range(1000*1000)], columns=['A'])
st=time.time()
for index, row in df.iterrows():
    row.A
print(time.time()-st)
45.05799984931946

st=time.time()
for row in df.itertuples():
    row.A
print(time.time() - st)
0.48400020599365234
31
Steven G

L'item de iterrows() n'est pas une série, mais un tuple de (index, Series), vous pouvez donc décompresser le tuple dans la boucle for de la manière suivante:

for (idx, row) in df.iterrows():
    print(row.loc['A'])
    print(row.A)
    print(row.index)

#0.890618586836
#0.890618586836
#Index(['A', 'B', 'C', 'D'], dtype='object')
18
Psidom
for i in range(1,len(na_rm.columns)):
           print ("column name:", na_rm.columns[i])

Sortie:

column name: seretide_price
column name: symbicort_mkt_shr
column name: symbicort_price
0
Avik Das