Правильный способ отменить pandas.DataFrame?

117

Вот мой код:

import pandas as pd

data = pd.DataFrame({'Odd':[1,3,5,6,7,9], 'Even':[0,2,4,6,8,10]})

for i in reversed(data):
    print(data['Odd'], data['Even'])

Когда я запускаю этот код, я получаю следующую ошибку:

Traceback (most recent call last):
  File "C:\Python33\lib\site-packages\pandas\core\generic.py", line 665, in _get_item_cache
    return cache[item]
KeyError: 5

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\*****\Documents\******\********\****.py", line 5, in <module>
    for i in reversed(data):
  File "C:\Python33\lib\site-packages\pandas\core\frame.py", line 2003, in __getitem__
    return self._get_item_cache(key)
  File "C:\Python33\lib\site-packages\pandas\core\generic.py", line 667, in _get_item_cache
    values = self._data.get(item)
  File "C:\Python33\lib\site-packages\pandas\core\internals.py", line 1656, in get
    _, block = self._find_block(item)
  File "C:\Python33\lib\site-packages\pandas\core\internals.py", line 1936, in _find_block
    self._check_have(item)
  File "C:\Python33\lib\site-packages\pandas\core\internals.py", line 1943, in _check_have
    raise KeyError('no item named %s' % com.pprint_thing(item))
KeyError: 'no item named 5'

Почему я получаю эту ошибку?
Как я могу это исправить?
Как правильно повернуть вспять pandas.DataFrame?

Майкл
источник
3
Какой результат вы ищете? "One"не является столбцом data, и я не знаю, Twoявляется ли это переменной или опечаткой для "Two", которая также не является столбцом. Вы просто хотите изменить порядок столбцов?
DSM
Вы имели в виду data[["Odd", "Even"]]или в более общем смысле data[data.columns[::-1]]?
Фред Фу
1
Вы все еще не привели пример желаемого результата. Я знаю, как обойти тот факт, что reversed(data)это не работает, но я не знаю, почему вы хотите распечатать все столбцы Oddи Evenстолбцы один раз для каждого столбца в кадре, что ваш код сделал бы, если бы вы его использовали reversed(list(data)).
DSM
Я хочу начать цикл с конца моего фрейма данных
Майкл
2
Тогда я думаю, что ваш вопрос - дубликат этого , и вы хотите что-то вроде for i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]. Пожалуйста, всегда приводите в своем вопросе примеры ожидаемого результата; это значительно облегчает жизнь каждому.
DSM

Ответы:

249
data.reindex(index=data.index[::-1])

или просто:

data.iloc[::-1]

изменит ваш фрейм данных, если вы хотите иметь forцикл, который идет снизу вверх, вы можете сделать:

for idx in reversed(data.index):
    print(idx, data.loc[idx, 'Even'], data.loc[idx, 'Odd'])

или

for idx in reversed(data.index):
    print(idx, data.Even[idx], data.Odd[idx])

Вы получаете сообщение об ошибке , потому что reversedпервые вызовы data.__len__()возвращающих 6. Затем он пытается вызвать data[j - 1]к jв range(6, 0, -1), а первый вызов будет data[5]; но в pandas dataframe data[5]означает столбец 5, а столбца 5 нет, поэтому он вызовет исключение. (см. документы )

behzad.nouri
источник
если у вас возникли проблемы, вы можете попробовать это:for index, row in df.iloc[::-1].iterrows():
Кристиан
1
любой способ сделать это на месте ? эквивалент гипотетическогоdata.reindex(index=data.index[::-1], inplace=True)
NeuronQ
3
Можно data = data.reindex(index=data.index[::-1])тогда data.reset_index(inplace=True, drop=True)и он будет сброшен на место.
Matts
4
Является df = df[::-1]вещий и правильное решение?
tommy.carstensen 06
@ tommy.carstensen да, и это должен быть лучший ответ
rosstripi
66

Вы можете перевернуть строки еще проще:

df[::-1]
user1951
источник
4
Мне нравится определять свой собственный reverse()метод, pd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1]потому что он выглядит лучше при объединении методов, например df.reverse().iterrows().
Бен Мареш
5

Ни один из существующих ответов не сбрасывает индекс после обращения фрейма данных.

Для этого сделайте следующее:

 data[::-1].reset_index()

Вот служебная функция, которая также удаляет старый столбец индекса, согласно комментарию @ Tim:

def reset_my_index(df):
  res = df[::-1].reset_index(drop=True)
  return(res)

Просто передайте фрейм данных в функцию

кибернетический
источник
1
Вы, вероятно, захотите drop=True, например:, data[::-1].reset_index(drop=True)иначе старый индекс будет добавлен как столбец в DataFrame.
Тим
Зачем вам это нужно?
Эндолит
1
@endolith Некоторые библиотеки ожидают, что фрейм данных будет проиндексирован. Например, некоторые библиотеки прогнозирования временных рядов ожидают в качестве входных данных индексированного кадра, чтобы можно было моделировать временной ряд, оставаясь при этом независимым от временного шага (день, месяц, год и т. Д.). Так что вы, возможно, работаете с фреймом данных, выполняете на нем преобразование, которое нарушает индексацию. Обычно таким образом фрейм переиндексируют.
Cybernetic
1

Это работает:

    for i,r in data[::-1].iterrows():
        print(r['Odd'], r['Even'])
Майкл Стырк
источник