Aqui está o meu código:
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'])
Quando executo este código, recebo o seguinte erro:
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'
Por que estou recebendo este erro?
Como posso consertar isso?
Qual é a maneira certa de reverter pandas.DataFrame
?
"One"
não é uma coluna emdata
, e não sei seTwo
é uma variável ou um erro de digitação para"Two"
, que também não é uma coluna. Você está apenas tentando inverter a ordem das colunas?data[["Odd", "Even"]]
, ou mais geralmentedata[data.columns[::-1]]
,?reversed(data)
não funciona, mas não sei por que você deseja imprimir todas as colunasOdd
eEven
uma vez para cada coluna no quadro, que é o que seu código faria se você usassereversed(list(data))
.for i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]
. Sempre dê exemplos em sua pergunta sobre a saída que você espera; torna a vida muito mais fácil para todos.Respostas:
ou simplesmente:
irá reverter seu quadro de dados, se você quiser ter um
for
loop que vai de baixo para cima, você pode fazer:ou
Você está recebendo um erro porque
reversed
primeiras chamadasdata.__len__()
que retorna 6. Em seguida, ele tenta chamardata[j - 1]
paraj
nosrange(6, 0, -1)
, e a primeira chamada seriadata[5]
; mas no pandas dataframedata[5]
significa coluna 5, e não há coluna 5, portanto, ele lançará uma exceção. (ver docs )fonte
for index, row in df.iloc[::-1].iterrows():
data.reindex(index=data.index[::-1], inplace=True)
data = data.reindex(index=data.index[::-1])
entãodata.reset_index(inplace=True, drop=True)
e ele será reiniciado no lugar.df = df[::-1]
uma solução pitônica e válida?Você pode inverter as linhas de uma maneira ainda mais simples:
fonte
reverse()
método compd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1]
porque fica mais bonito ao encadear métodos, por exemplodf.reverse().iterrows()
.Nenhuma das respostas existentes redefine o índice após reverter o dataframe.
Para isso, faça o seguinte:
Aqui está uma função de utilidade que também remove a coluna do índice antigo, de acordo com o comentário de @Tim:
Basta passar seu dataframe para a função
fonte
drop=True
, ou sejadata[::-1].reset_index(drop=True)
:, caso contrário, o índice antigo será adicionado como uma coluna no DataFrame.Isso funciona:
fonte