over loop itertuples iterrows iter for columns python pandas next

itertuples - pandas python for loop



iterrows pandas obtienen el valor de las siguientes filas (3)

En primer lugar, su "manera desordenada" está bien, no hay nada de malo en usar índices en el marco de datos, y esto no será demasiado lento. iterrows () en sí no es terriblemente rápido.

Una versión de tu primera idea que funcionaría sería:

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

El segundo método podría hacer algo similar, para guardar un índice en el marco de datos:

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

Cuando la velocidad es crítica, siempre puedes probar ambos y programar el código.

Tengo un df en pandas

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

Quiero iterar sobre filas en df. Para cada fila quiero s value and next row fila s value and next row Algo así como (no funciona):

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

Como resultado quiero

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

En este punto tengo lío para resolver esto

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

¿Hay alguna forma más eficiente de resolver este problema?


Esto se puede resolver también mediante el izip ping del marco de datos (iterador) con una versión de desplazamiento de sí mismo.

Por supuesto, el error de indexación no se puede reproducir de esta manera.

Mira esto

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'']

lo que da

AA BB BB CC


Hay un ejemplo de función pairwise() en el documento de itertools :

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"]

Aquí está la salida:

0 1 AA BB 1 2 BB CC

Pero, creo que las filas de iter en un DataFrame son lentas, si puedes explicar cuál es el problema que quieres resolver, quizás te pueda sugerir algún método mejor.