iterrows pandas получить следующие строки значение

у меня есть df в панд

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

Я хочу перебирать строки в df. Для каждой строки Я хочу, чтобы строкиs value and next rowзначение s Что-то вроде(это не работает):

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

в итоге я хочу!--6-->

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

на данный момент у меня есть беспорядок, чтобы решить эту проблему

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

есть ли более эффективный способ решить эту проблему?

3 ответов


во-первых, ваш "грязный способ" в порядке, нет ничего плохого в использовании индексов в фрейме данных, и это не будет слишком медленным. iterrows () сам по себе не очень быстрый.

версия первая мысль это:

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

второй метод может сделать что-то подобное, чтобы сохранить один индекс в фрейме данных:

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

когда скорость критическая, вы всегда можете попробовать и время кода.


есть pairwise() пример функции в 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"]

вот вывод:

0 1 AA BB
1 2 BB CC

но, я думаю, что ИТЭР строк DataFrame медленно, если вы можете объяснить, какие проблемы вы хотите решить, может быть, я могу предложить лучший способ.


Это можно решить также с помощью izipping фрейм данных (итератор) со смещенной версией самого себя.

конечно, ошибки индексации не может быть воспроизведена таким образом.

зацените

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

что дает

AA
BB
BB
CC