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 ejecuto este código, aparece 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
?
"One"
no es una columnadata
, y no sé siTwo
es una variable o un error tipográfico"Two"
, que tampoco es una columna. ¿Está buscando invertir el orden de las columnas?data[["Odd", "Even"]]
, o más en generaldata[data.columns[::-1]]
,?reversed(data)
que no funciona, pero no sé por qué querría imprimir el conjuntoOdd
y lasEven
columnas una vez para cada columna en el marco, que es lo que haría su código si lo usarareversed(list(data))
.for i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]
. En su pregunta, proporcione siempre ejemplos del resultado que espera; hace la vida mucho más fácil para todos.Respuestas:
o simplemente:
invertirá su marco de datos, si desea tener un
for
bucle que vaya de abajo hacia arriba, puede hacer:o
Que está recibiendo un error porque
reversed
primeras llamadasdata.__len__()
que devuelve 6. Finalmente se trata de llamardata[j - 1]
paraj
enrange(6, 0, -1)
, y la primera llamada seríadata[5]
; pero en pandas dataframedata[5]
significa columna 5, y no hay columna 5, por lo que arrojará una excepción. (ver documentos )fuente
for index, row in df.iloc[::-1].iterrows():
data.reindex(index=data.index[::-1], inplace=True)
data = data.reindex(index=data.index[::-1])
a continuación,data.reset_index(inplace=True, drop=True)
y se restablecerá en su lugar.df = df[::-1]
una solución pitónica y válida?Puede invertir las filas de una manera aún más simple:
fuente
reverse()
método conpd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1]
porque se ve mejor al encadenar métodos, por ejemplodf.reverse().iterrows()
.Ninguna de las respuestas existentes restablece el índice después de invertir el marco de datos.
Para ello, haga lo siguiente:
Aquí hay una función de utilidad que también elimina la columna de índice anterior, según el comentario de @ Tim:
Simplemente pase su marco de datos a la función
fuente
drop=True
, es decir:, de lodata[::-1].reset_index(drop=True)
contrario, el índice anterior se agregará como una columna en el DataFrame.Esto funciona:
fuente