Właściwy sposób na odwrócenie pandy.DataFrame?

117

Oto mój kod:

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

Po uruchomieniu tego kodu pojawia się następujący błąd:

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'

Dlaczego otrzymuję ten błąd?
Jak mogę to naprawić?
Jaki jest właściwy sposób odwrócenia pandas.DataFrame?

Michael
źródło
3
Jakiego produktu szukasz? "One"nie jest kolumną w datai nie wiem, czy Twojest to zmienna, czy literówka dla "Two", która również nie jest kolumną. Czy chcesz tylko odwrócić kolejność kolumn?
DSM
Czy miałeś na myśli data[["Odd", "Even"]], czy bardziej ogólnie data[data.columns[::-1]],?
Fred Foo,
1
Nadal nie podałeś przykładu żądanego wyniku. Wiem, jak obejść ten fakt reversed(data), nie działa, ale nie wiem, dlaczego chcesz wydrukować całość Oddi Evenkolumny raz dla każdej kolumny w ramce, co zrobiłby twój kod, gdybyś użył reversed(list(data)).
DSM
Chcę zacząć pętlę for od końca mojej dataFrame
Michael
2
Więc myślę, że twoje pytanie jest dupkiem tego , a chcesz czegoś takiego for i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]. Prosimy zawsze podawać w pytaniu przykłady oczekiwanego wyniku; znacznie ułatwia życie wszystkim.
DSM

Odpowiedzi:

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

lub po prostu:

data.iloc[::-1]

odwróci twoją ramkę danych, jeśli chcesz mieć forpętlę, która idzie z dołu do góry, możesz zrobić:

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

lub

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

Otrzymujesz błąd, ponieważ reversedpierwsze zaproszenia data.__len__(), która zwraca 6. Następnie próbuje zadzwonić data[j - 1]do jw range(6, 0, -1), a pierwsze wezwanie będzie data[5]; ale w pandach dataframe data[5]oznacza kolumnę 5 i nie ma kolumny 5, więc zgłosi wyjątek. (patrz dokumentacja )

behzad.nouri
źródło
jeśli masz problemy, możesz spróbować tego:for index, row in df.iloc[::-1].iterrows():
kristian
jakikolwiek sposób, aby to zrobić na miejscu ? odpowiednik hipotetycznegodata.reindex(index=data.index[::-1], inplace=True)
NeuronQ
3
Można zrobić data = data.reindex(index=data.index[::-1])wtedy data.reset_index(inplace=True, drop=True)i będzie zresetowane w miejscu.
Matts,
4
Czy df = df[::-1]Pythonowe i prawidłowe rozwiązanie?
tommy.carstensen
@ tommy.carstensen tak, i to powinna być najlepsza odpowiedź
rosstripi
66

Możesz odwrócić rzędy w jeszcze prostszy sposób:

df[::-1]
user1951
źródło
4
Lubię definiować własną reverse()metodę za pomocą, pd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1]ponieważ ładniej wygląda przy łączeniu metod łańcuchowych, np df.reverse().iterrows().
Ben Mares
5

Żadna z istniejących odpowiedzi nie resetuje indeksu po odwróceniu ramki danych.

W tym celu wykonaj następujące czynności:

 data[::-1].reset_index()

Oto funkcja narzędzia, która usuwa również starą kolumnę indeksu, zgodnie z komentarzem @ Tima:

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

Po prostu przekaż ramkę danych do funkcji

Cybernetyczny
źródło
1
Prawdopodobnie chcesz mieć drop=True, tj .: data[::-1].reset_index(drop=True)w przeciwnym razie stary indeks zostanie dodany jako kolumna w DataFrame.
Tim
Dlaczego chcesz to zrobić?
endolit
1
@endolith Niektóre biblioteki oczekują, że ramka danych będzie indeksowana. Na przykład niektóre biblioteki prognozujące serie czasowe oczekują ramki indeksowanej jako danych wejściowych, tak aby mogły modelować szereg czasowy, pozostając niezależnym od przedziału czasowego (dzień, miesiąc, rok itp.). Więc możesz pracować z ramką danych, wykonaj na niej transformację, co zepsuje indeksowanie. W ten sposób często reindeksuje się ramkę.
Cybernetic
1

To działa:

    for i,r in data[::-1].iterrows():
        print(r['Odd'], r['Even'])
Michael Styrk
źródło