Цикл по строкам данных в обратном порядке - PullRequest
0 голосов
/ 30 апреля 2019

Я пытался перебрать строки данных в обратном порядке.

На основе позиции строки, а не имени индекса.

Я думаю, этот код должен работать, но это не так.

for i, row in enumerate(df[::-1].iterrows()):  
    print (i)

Как и когда я его запускаю, он выдает

0
1
2
3
4
5

вместо

5
4
3
2
1
0

Ответы [ 2 ]

0 голосов
/ 30 апреля 2019

Если вы принимаете переиндексацию, вы также можете сделать

for i, row in enumerate(df.reindex().sort_index(ascending=False):  
    print (i)
0 голосов
/ 30 апреля 2019

Комментарий о том, как использовать iterrows() в вопросе, дает ответ о циклическом прохождении строк DataFrame в обратном порядке. Это также вводит идею использования понимания списка для простоты.

Проблемы с производительностью и памятью для все более крупных наборов данных будут встречаться. Существует более эффективный способ доступа к данным в обратном направлении DataFrame.

Следующее сделано для того, чтобы помочь в руководстве для новых пользователей Pandas. Суть состоит в том, чтобы поместить метки индексов в кадре данных в столбец, который создает новый индекс, который упорядочен, сохраняя положение строки и, следовательно, обращенный.

import pandas as pd
import numpy as np
import timeit
print(pd.__version__)

# random dataframe, provides ordered rangeindex
df = pd.DataFrame(np.random.randint(0,1000,size=(1000, 4)), columns=list('ABCD'))
# toss the ordered rangeindex and make the random 'A' the index
df.set_index(['A'], inplace=True)
# df is now a dataframe with an unordered index

def iterate(df):
    for i,r in df[::-1].iterrows():
        # process
        pass

def sort_and_apply(df):
    # apply order to the index by resetting it to a column
    # this indicates original row position by create a rangeindex.
    # (this also copies the dataframe, critically slowing down this function 
    # which is still much faster than iterate()).
    new_df = df.reset_index()

    # sort on the newly applied rangeindex and process
    new_df.sort_index(ascending=False).apply(lambda x:x)

if __name__ == '__main__':
    print("iterate ", timeit.timeit("iterate(df)", setup="from __main__ import iterate, df", number=50))
    print("sort_and_apply ",timeit.timeit("sort_and_apply(df)", setup="from __main__ import sort_and_apply, df", number=50))

Производит

0.24.2
iterate  2.893160949
sort_and_apply  0.12744747599999995
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...