Índice de acceso del último elemento en el dataframe

He estado buscando esto pero parece que no puedo encontrarlo (aunque debe ser extremadamente trivial).

El problema que tengo es que me gustaría recuperar el valor de una columna para las primeras y últimas entradas de un dataframe. Pero si lo hago:

df.ix[0]['date'] 

Yo obtengo:

 datetime.datetime(2011, 1, 10, 16, 0) 

pero si lo hago:

 df[-1:]['date'] 

Yo obtengo:

 myIndex 13 2011-12-20 16:00:00 Name: mydate 

Con un formato diferente. Idealmente, me gustaría poder acceder al valor del último índice del dataframe, pero no puedo encontrar cómo.

Incluso intenté crear una columna (IndexCopy) con los valores del índice y probé:

 df.ix[df.tail(1)['IndexCopy']]['mydate'] 

pero esto también produce un formato diferente (ya que df.tail (1) [‘IndexCopy’] no genera un entero simple).

¿Algunas ideas?

La primera respuesta ahora es reemplazada por .iloc :

 >>> df = pd.DataFrame({"date": range(10, 64, 8)}) >>> df.index += 17 >>> df date 17 10 18 18 19 26 20 34 21 42 22 50 23 58 >>> df["date"].iloc[0] 10 >>> df["date"].iloc[-1] 58 

La forma más corta en que puedo pensar utiliza .iget() :

 >>> df = pd.DataFrame({"date": range(10, 64, 8)}) >>> df.index += 17 >>> df date 17 10 18 18 19 26 20 34 21 42 22 50 23 58 >>> df['date'].iget(0) 10 >>> df['date'].iget(-1) 58 

Alternativamente:

 >>> df['date'][df.index[0]] 10 >>> df['date'][df.index[-1]] 58 

También hay .first_valid_index() y .last_valid_index() , pero dependiendo de si desea o no descartar los NaN es posible que no sean lo que desea.

Recuerde que df.ix[0] no le da lo primero, sino el indexado por 0. Por ejemplo, en el caso anterior, df.ix[0] produciría

 >>> df.ix[0] Traceback (most recent call last): File "", line 1, in  df.ix[0] [...] KeyError: 0 

Combinando la respuesta de @comte y la respuesta de dmdip en Obtener índice de una fila de un dataframe de pandas como un entero

 df.tail(1).index.item() 

Te da el valor del índice.


Tenga en cuenta que los índices no siempre están bien definidos, no importa que estén indexados de forma múltiple o única. La modificación de los marcos de datos utilizando índices puede dar lugar a un comportamiento inesperado. Tendremos un ejemplo con un caso de múltiples índices, pero tenga en cuenta que esto también es cierto en un caso de un solo índice .

Digamos que tenemos

 df = pd.DataFrame({'x':[1,1,3,3], 'y':[3,3,5,5]}, index=[11,11,12,12]).stack() 11 x 1 y 3 x 1 y 3 12 x 3 y 5 # the index is (12, 'y') x 3 y 5 # the index is also (12, 'y') df.tail(1).index.item() # gives (12, 'y') 

Intentando acceder al último elemento con el índice df[12, "y"] obtiene

 (12, y) 5 (12, y) 5 dtype: int64 

Si intenta modificar el dataframe según el índice (12, y) , modificará dos filas en lugar de una. Por lo tanto, aunque aprendimos a acceder al valor del índice de la última fila, puede que no sea una buena idea si desea cambiar los valores de la última fila según su índice, ya que puede haber muchos que compartan el mismo índice. Debería usar df.iloc[-1] para acceder a la última fila en este caso.

Referencia

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.item.html

 df.tail(1).index 

parece lo mas legible

Puede ser demasiado tarde ahora, uso el método de index para recuperar el último índice de un DataFrame, luego uso [-1] para obtener los últimos valores:

Por ejemplo,

 df = pd.DataFrame(np.zeros((4, 1)), columns=['A']) print(f'df:\n{df}\n') print(f'Index = {df.index}\n') print(f'Last index = {df.index[-1]}') 

La salida es

 df: A 0 0.0 1 0.0 2 0.0 3 0.0 Index = RangeIndex(start=0, stop=4, step=1) Last index = 3