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?
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 NaN
s, 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
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
df.tail(1).index
semble le plus lisible
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