iterrows pandas obtenir la valeur des lignes suivantes

j'ai un df dans les pandas

import pandas as pd
df = pd.DataFrame(['AA', 'BB', 'CC'], columns = ['value'])

je veux itérer sur les lignes en df. Pour chaque rang je veux rangs value and next rowvaleur s Quelque chose comme(il ne fonctionne pas):

for i, row in df.iterrows():
     print row['value']
     i1, row1 = next(df.iterrows())
     print row1['value']

Comme un résultat que je souhaite

'AA'
'BB'
'BB'
'CC'
'CC'
*Wrong index error here  

À ce stade, je mess façon de résoudre ce problème

for i in range(0, df.shape[0])
   print df.irow(i)['value']
   print df.irow(i+1)['value']

Est-il plus efficace pour résoudre ce problème?

19
demandé sur Ayrat 2014-04-18 13:26:44

3 réponses

tout d'abord, votre "façon désordonnée" est ok, il n'y a rien de mal à utiliser des indices dans la base de données, et ce ne sera pas trop lent. iterrows () lui-même n'est pas très rapide.

une version de votre première idée qui fonctionnerait serait:

row_iterator = df.iterrows()
_, last = row_iterator.next()  # take first item from row_iterator
for i, row in row_iterator:
    print(row['value'])
    print(last['value'])
    last = row

la seconde méthode pourrait faire quelque chose de similaire, pour sauver un index dans le dataframe:

last = df.irow(0)
for i in range(1, df.shape[0]):
    print(last)
    print(df.irow(i))
    last = df.irow(i)

Quand la vitesse est critique, vous pouvez toujours essayer les deux et le code.

15
répondu alisdt 2015-06-19 14:07:17

il y a un pairwise() exemple de fonction dans le itertools document:

from itertools import tee, izip
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

import pandas as pd
df = pd.DataFrame(['AA', 'BB', 'CC'], columns = ['value'])

for (i1, row1), (i2, row2) in pairwise(df.iterrows()):
    print i1, i2, row1["value"], row2["value"]

Voici la sortie:

0 1 AA BB
1 2 BB CC

Mais, je pense que iter lignes dans un DataFrame est lent, si vous pouvez expliquer quel est le problème que vous voulez résoudre, peut-être que je peux suggérer une meilleure méthode.

9
répondu HYRY 2014-04-18 13:23:54

ceci peut être résolu aussi par izipping la dataframe (iterator) avec une version offset de lui-même.

bien sûr, l'erreur d'indexation ne peut pas être reproduite de cette façon.

Check this out

import pandas as pd
from itertools import izip

df = pd.DataFrame(['AA', 'BB', 'CC'], columns = ['value'])   

for id1, id2 in izip(df.iterrows(),df.ix[1:].iterrows()):
    print id1[1]['value']
    print id2[1]['value']

ce qui donne

AA
BB
BB
CC
2
répondu Acorbe 2015-05-05 20:09:22