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
?
"One"
nie jest kolumną wdata
i nie wiem, czyTwo
jest to zmienna, czy literówka dla"Two"
, która również nie jest kolumną. Czy chcesz tylko odwrócić kolejność kolumn?data[["Odd", "Even"]]
, czy bardziej ogólniedata[data.columns[::-1]]
,?reversed(data)
, nie działa, ale nie wiem, dlaczego chcesz wydrukować całośćOdd
iEven
kolumny raz dla każdej kolumny w ramce, co zrobiłby twój kod, gdybyś użyłreversed(list(data))
.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.Odpowiedzi:
lub po prostu:
odwróci twoją ramkę danych, jeśli chcesz mieć
for
pętlę, która idzie z dołu do góry, możesz zrobić:lub
Otrzymujesz błąd, ponieważ
reversed
pierwsze zaproszeniadata.__len__()
, która zwraca 6. Następnie próbuje zadzwonićdata[j - 1]
doj
wrange(6, 0, -1)
, a pierwsze wezwanie będziedata[5]
; ale w pandach dataframedata[5]
oznacza kolumnę 5 i nie ma kolumny 5, więc zgłosi wyjątek. (patrz dokumentacja )źródło
for index, row in df.iloc[::-1].iterrows():
data.reindex(index=data.index[::-1], inplace=True)
data = data.reindex(index=data.index[::-1])
wtedydata.reset_index(inplace=True, drop=True)
i będzie zresetowane w miejscu.df = df[::-1]
Pythonowe i prawidłowe rozwiązanie?Możesz odwrócić rzędy w jeszcze prostszy sposób:
źródło
reverse()
metodę za pomocą,pd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1]
ponieważ ładniej wygląda przy łączeniu metod łańcuchowych, npdf.reverse().iterrows()
.Żadna z istniejących odpowiedzi nie resetuje indeksu po odwróceniu ramki danych.
W tym celu wykonaj następujące czynności:
Oto funkcja narzędzia, która usuwa również starą kolumnę indeksu, zgodnie z komentarzem @ Tima:
Po prostu przekaż ramkę danych do funkcji
źródło
drop=True
, tj .:data[::-1].reset_index(drop=True)
w przeciwnym razie stary indeks zostanie dodany jako kolumna w DataFrame.To działa:
źródło