Índice de acceso del último elemento en el marco de datos

83

Estoy 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 marco de datos. 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 marco de datos, 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?

elelias
fuente

Respuestas:

129

La respuesta anterior 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 que puedo pensar en usos .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 NaNs, es posible que no sean lo que desea.

Recuerde que df.ix[0]no le da el 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 "<ipython-input-489-494245247e87>", line 1, in <module>
    df.ix[0]
[...]
KeyError: 0
DSM
fuente
gracias por tu respuesta. Sin embargo, tengo otro marco de datos en el que df.ix [0] parece dar la primera fila del marco de datos, aunque el primer índice no es 0. En particular, el resultado de df.index [0] no es 0 y, sin embargo, df.ix [df.index [0]] y df.ix [0] dan el mismo resultado. ¿Porqué es eso?
elelias
Necesitaría ver el índice, pero sospecho que se debe a que el índice no es numérico, en cuyo caso el acceso por número entero puede comportarse como si fuera un índice y no una clave. Esto se debe a que no hay ambigüedad en lo que está pidiendo si lo pide Something(["A", "B", "C"])[1], pero ¿qué quiere si lo tiene Something([1,2,3,4])[1]? Lea las distintas secciones aquí en los documentos sobre algunos de los dolores de cabeza involucrados.
DSM
¿Cómo usar df ['xxx'] [df.index [0]] para un flotador? Tengo un flotador 56.7888 y se convierte a 56 en lugar de 57
lvthillo
1
Llamar iget()da 'Series' object has no attribute 'iget'.
Suzana
15

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

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

le da el valor del índice.


Tenga en cuenta que los índices no siempre están bien definidos, no importa si tienen un índice múltiple o un índice único. La modificación de los marcos de datos mediante índices puede provocar un comportamiento inesperado. Tendremos un ejemplo con un caso de índices múltiples, pero tenga en cuenta que esto también es cierto en un caso de índice único .

Di 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 los df[12, "y"]rendimientos del índice

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

Si intenta modificar el marco de datos en función del í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 en función de su índice, ya que podría haber muchos que compartan el mismo índice. Sin df.iloc[-1]embargo, debe usar para acceder a la última fila en este caso.

Referencia

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

Tai
fuente
7
df.tail(1).index 

parece el más legible

comte
fuente
Esto no devuelve un número sino: RangeIndex (inicio = 6, parada = 7, paso = 1)
alexandergs
5
alex: de lo devuelto index, start=6indica el desplazamiento del último elemento. Entonces, df.tail(1)obtiene el último elemento, df["your_column"][6]sería el último elemento, para your_column, etc. (pero df.last_valid_index()le da solo el número)
Michael
2

Puede que sea demasiado tarde ahora, utilizo el indexmétodo para recuperar el último índice de un DataFrame, luego lo 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
yoonghm
fuente
2

Quieres .iloc con corchetes dobles.

import pandas as pd
df = pd.DataFrame({"date": range(10, 64, 8), "not_date": "fools"})
df.index += 17
df.iloc[[0,-1]][['date']]

Le da a .iloc una lista de índices, específicamente el primero y el último, [0, -1]. Eso devuelve un marco de datos desde el que solicita la columna 'fecha'. ['fecha'] le dará una serie ( puaj ), y [['fecha']] le dará un marco de datos.

grofte
fuente
0

Pandas admite la sintaxis NumPy que permite:

df[len(df) -1:].index[0]
Cuántico
fuente