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.