web-dev-qa-db-fra.com

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

J'ai cherché ça mais je n'arrive pas à le trouver (même si ça doit être extrêmement trivial).

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

df.ix[0]['date']

Je reçois:

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

mais si je le fais:

df[-1:]['date']

Je reçois:

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 index du bloc 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 aussi un format différent (puisque df.tail (1) ['IndexCopy'] ne génère pas un entier simple). 

Des idées? 

42
elelias

La réponse précédente est maintenant 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 puisse 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 existe également .first_valid_index() et .last_valid_index(), mais selon que vous souhaitiez exclure ou non NaNs, elles pourraient ne pas correspondre à vos souhaits.

Rappelez-vous que df.ix[0] ne vous donne pas le premier, mais celui 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
63
DSM

Combinaison de la réponse de @ comte et de dmdip dans Obtenir l'index d'une ligne d'une trame de données pandas sous la forme d'un entier

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

vous donne la valeur de l'index.


Notez que les index sont pas toujours bien définis, peu importe qu'ils soient multi-indexés ou indexés individuellement. La modification de trames de données à l'aide d'index peut entraîner un comportement inattendu. Nous aurons un exemple avec un cas multi-indexé mais notez que ceci est également vrai dans un cas à index 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"] 

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

Si vous essayez de modifier le cadre de données en fonction de l'index (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, il ne serait peut-être pas judicieux de changer les valeurs de la dernière ligne en fonction de son index, car il est possible que plusieurs partagent le même index . Vous devez cependant 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

9
Tai
df.tail(1).index 

semble le plus lisible

3
comte

Il est peut-être trop tard maintenant, j'utilise la méthode index pour récupérer le dernier index d'un DataFrame, puis j'utilise [-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]}')

La sortie 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
0
yoonghm