La forma correcta de revertir pandas.¿DataFrame?


Aquí está mi 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'])

Cuando corro este código, obtengo el siguiente error:

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 qué recibo este error?
¿Cómo puedo arreglar eso?
¿Cuál es la forma correcta de revertir pandas.DataFrame?

Author: Michael, 2013-12-07

2 answers

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

O simplemente:

data.iloc[::-1]

Invertirá su marco de datos, si desea tener un bucle for que va de abajo a arriba, puede hacer:

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

O

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

Está recibiendo un error porque reversed primero llama a data.__len__() que devuelve 6. Entonces intenta llamar data[j - 1] para j en range(6, 0, -1), y la primera llamada sería data[5]; pero en pandas dataframe data[5] significa columna 5, y no hay columna 5 por lo que lanzará una excepción. (véase docs )

 127
Author: behzad.nouri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-21 23:06:55

Puede invertir las filas de una manera aún más simple:

df[::-1]
 17
Author: user1951,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-27 20:26:47