2017-04-25 1 views
9

J'essaie de parcourir les lignes d'une structure de données Python Pandas. Dans chaque rangée de la base de données, j'essaie de faire référence à chaque valeur le long d'une rangée par son nom de colonne.Les Pandas Python parcourent les lignes et accèdent aux noms des colonnes

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 

je this approach à itérer, mais il ne me donne une partie de la solution - après avoir sélectionné une ligne dans chaque itération, comment puis-je accéder éléments de la ligne par leur nom de colonne?

Voici ce que je suis en train de faire:

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

Ma compréhension est que la ligne est un Pandas series. Mais je n'ai aucun moyen d'indexer dans la série.

Est-il possible d'utiliser des noms de colonnes tout en effectuant une itération sur des lignes?

+1

'row' dans votre exemple n'est pas une série, ce devrait être un tuple. Mais si vous faites 'pour idx, row dans df.iterrows()', row ['A'] 'devrait fonctionner correctement? – ayhan

+0

Voilà ce qui me manquait! Merci. –

Répondre

12

L'élément de iterrows() n'est pas une série, mais un tuple (indice, série), de sorte que vous pouvez déballer le tuple dans la boucle comme ceci:

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') 
+0

@StevenG Ouais. C'est ce que je voulais dire. Je suppose que c'est plus clair si on dit (index, série). – Psidom

+0

utilisez itertuples() comme suggéré dans la deuxième réponse ... Si vous travaillez avec une grande interframes de données est beaucoup plus rapide – Megha

7

J'aime aussi itertuples()

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

depuis la ligne est un tuples nommé, si vous vouliez dire aux valeurs d'accès sur chaque ligne cela devrait être BEAUCOUP plus rapide

course:

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 
+0

Merci! Je pense que c'est ce que j'avais en tête (mais je ne m'en souviens pas). C'est beaucoup plus pratique (puisqu'il n'y a pas besoin de 'idx', comme avoir' énumérer 'une liste). Puisque j'ai demandé 'iterrows()', je vais aller avec cette réponse. Mais c'est ce que j'aurais utilisé si je me souvenais. –

+0

est comme 100x plus rapide de cette façon .. –

+0

@StevenG, merci pour la comparaison des performances. – vlmercado