98 votes

Index d'accès du dernier élément du cadre de données

J'ai cherché partout mais je n'ai pas trouvé (bien que cela doive être extrêmement trivial).

Le problème que je rencontre est que je voudrais récupérer la valeur d'une colonne pour la première et la dernière entrée d'un cadre de données. Mais si je le fais :

df.ix[0]['date']

J'ai compris :

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

mais si je le fais :

df[-1:]['date']

J'ai compris :

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

avec un format différent. Idéalement, j'aimerais pouvoir accéder à la valeur du dernier indice du cadre de données, mais je ne trouve pas comment.

J'ai même essayé de créer une colonne (IndexCopy) avec les valeurs de l'index et d'essayer :

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

mais cela donne également un format différent (puisque df.tail(1)['IndexCopy'] ne produit pas un simple entier).

Des idées ?

163voto

DSM Points 71975

La première réponse est désormais remplacée par .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

Le moyen le plus court auquel je peux penser utilise .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

Alternativement :

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

Il y a aussi .first_valid_index() y .last_valid_index() mais selon que l'on veuille ou non exclure NaN ils ne sont peut-être pas ce que vous voulez.

Rappelez-vous que df.ix[0] ne vous donne pas le premier, mais celui qui est indexé par 0. Par exemple, dans le cas ci-dessus, df.ix[0] produirait

>>> df.ix[0]
Traceback (most recent call last):
  File "<ipython-input-489-494245247e87>", line 1, in <module>
    df.ix[0]
[...]
KeyError: 0

24voto

Tai Points 4569

En combinant la réponse de @comte et celle de dmdip en Obtenir l'index d'une ligne d'un cadre de données pandas sous forme d'un nombre entier.

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

vous donne la valeur de l'indice.


Notez que les indices sont pas toujours bien définis, qu'ils soient multi-indexés ou mono-indexés. La modification des cadres de données à l'aide d'indices peut entraîner un comportement inattendu. Nous allons avoir un exemple avec un cas multi-indexé mais notez que ceci est également vrai dans un cas d'indexation unique .

Disons que nous avons

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')

Essayer d'accéder au dernier élément avec l'index df[12, "y"] donne

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

Si vous tentez de modifier le cadre de données sur la base de l'indice (12, y) vous modifierez deux lignes au lieu d'une. Ainsi, même si nous avons appris à accéder à la valeur de l'index de la dernière ligne, ce n'est pas une bonne idée si vous voulez changer les valeurs de la dernière ligne en fonction de son index. car il pourrait y en avoir plusieurs qui partagent le même indice. Vous devez utiliser df.iloc[-1] pour accéder à la dernière ligne dans ce cas.

Référence

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

8voto

comte Points 750
df.tail(1).index 

semble le plus lisible

3voto

yoonghm Points 1213

C'est peut-être trop tard maintenant, j'utilise index pour récupérer le dernier indice d'un DataFrame, puis utiliser la méthode [-1] pour obtenir les dernières valeurs :

Par exemple,

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]}')

Le résultat est

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

2voto

grofte Points 618

Vous voulez un .iloc avec des doubles crochets.

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

Vous donnez à .iloc une liste d'index - en particulier le premier et le dernier, [0, -1]. Cela renvoie un cadre de données à partir duquel vous demandez la colonne 'date'. L'option ['date'] vous donnera une série ( beurk ), et [['date']] vous donnera un cadre de données.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X