2015-09-11 3 views
0

Кажется, что yield не работает с pandas.DataFrame.itertuples(), почему?Выход не работает с pandas.DataFrame.itertuples()?

dates = pd.date_range('20130101', periods=6)  
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD')) 

def f(): 
    for r in df.itertuples(): 
    yield r 

print(f().next()) 
print(f().next()) 

1-я строка выведена дважды.

EDIT

исходный код:

DataHandler(object): 
    def __init__(self, csv_dir): 
     self.csv_dir = csv_dir 
     self.data = pd.DataFrame() 
     self._open_convert_csv_files() 

    def _open_convert_csv_files(self): 
     self.data = pd.read_csv(self.csv_dir) 

    def _get_new_row(self): 
     for t in self.data.itertuples(): 
      yield t 

    def get_N_rows(self, N=1): 
      list = [] 
      for i in range(N): 
      row = self._get_new_row().next() # problem is here 
      list.append(row) 
      return list 

Я зову self._get_new_row() в get_N_rows, который является проблемой, каждый раз, когда я называю _get_new_row() я получаю только 1-й ряд, как бы я сделать g = _get_new_row() для g в качестве участника?

+0

Я думаю, что я понял, внутри '__init__' do' self.g = self._get_new_row() 'и меняет' self._get_new_row(). Next() 'to' self.g.next() 'работает. – Allanqunzi

ответ

3

Дважды звоните f и, следовательно, df.itertuples.

Вы имели в виду

g = f() 
print(g.next()) 
print(g.next()) 

Кстати f это довольно бессмысленно, что нужно определить. Надеюсь, это выглядит совсем не так, как вы бы на самом деле планировали использовать.

+0

@Allanqunzi, разместите все свои файлы для определения класса и использования класса. –

+0

обновлено, любая помощь будет оценена. – Allanqunzi

Смежные вопросы