Правильний спосіб повернення панд.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

Я хочу почати цикл з кінця моїх данихFrame
Michael

2
Тоді я думаю, що ваше запитання є дублюванням цього , і ви хочете чогось подібного for i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]. Будь-ласка, завжди наводьте приклади у вашому питанні очікуваного результату; це значно полегшує життя кожному.
DSM

Відповіді:


247
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]; але в пандах фрейм даних data[5]означає стовпчик 5, а стовпця 5 немає, тому він буде кидати виняток. (див. документи )


якщо у вас є проблеми, ви можете спробувати це:for index, row in df.iloc[::-1].iterrows():
Крістіан

будь-який спосіб зробити це на місці ? еквівалент гіпотетичногоdata.reindex(index=data.index[::-1], inplace=True)
NeuronQ

3
Можна зробити і data = data.reindex(index=data.index[::-1])тоді data.reset_index(inplace=True, drop=True)він буде скинутий на місце.
Матс

4
Чи df = df[::-1]пітонічне та дійсне рішення?
tommy.carstensen

@ tommy.carstensen так, і це має бути найкраща відповідь
rosstripi

66

Ви можете змінити рядки ще простішим способом:

df[::-1]

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

5

Жодна з існуючих відповідей не скидає індекс після відміни кадру даних.

Для цього виконайте наступне:

 data[::-1].reset_index()

Ось функція утиліти, яка також видаляє старий стовпчик індексу, згідно коментаря @ Тіма:

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 Деякі бібліотеки очікують, що кадр даних буде індексований. Наприклад, деякі бібліотеки прогнозування часових рядів очікують, що індексований кадр є вхідним, щоб він міг моделювати часовий ряд, залишаючись агностичним часовим кроком (день, місяць, рік тощо). Таким чином, ви можете працювати з фреймом даних, робити перетворення на ньому, яке заплутує індексацію. Тим самим прийнято повторно переробляти кадр.
Кібернетичний

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.