Zugriffsindex des letzten Elements im Datenrahmen


83

Ich habe mich danach umgesehen, aber ich kann es nicht finden (obwohl es extrem trivial sein muss).

Das Problem, das ich habe, ist, dass ich den Wert einer Spalte für den ersten und den letzten Eintrag eines Datenrahmens abrufen möchte. Aber wenn ich es mache:

df.ix[0]['date']

Ich bekomme:

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

aber wenn ich es mache:

df[-1:]['date']

Ich bekomme:

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

mit einem anderen Format. Im Idealfall möchte ich auf den Wert des letzten Index des Datenrahmens zugreifen können, kann aber nicht finden, wie.

Ich habe sogar versucht, eine Spalte (IndexCopy) mit den Werten des Index zu erstellen und zu versuchen:

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

Dies ergibt aber auch ein anderes Format (da df.tail (1) ['IndexCopy'] keine einfache Ganzzahl ausgibt).

Irgendwelche Ideen?

Antworten:


129

Die frühere Antwort wird nun ersetzt durch .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

Der kürzeste Weg, den ich mir vorstellen kann .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

Alternative:

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

Es gibt auch .first_valid_index()und .last_valid_index(), aber je nachdem, ob Sie NaNs ausschließen möchten oder nicht, sind sie möglicherweise nicht das, was Sie möchten.

Denken df.ix[0]Sie daran, dass Sie nicht die erste erhalten, sondern die mit 0 indizierte. Im obigen Fall df.ix[0]würde dies beispielsweise zu einer Erzeugung führen

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

Danke für deine Antwort. Ich habe jedoch einen anderen Datenrahmen, in dem df.ix [0] die erste Zeile des Datenrahmens zu geben scheint, obwohl der erste Index nicht 0 ist. Insbesondere ist das Ergebnis von df.index [0] nicht 0 und doch ergeben df.ix [df.index [0]] und df.ix [0] das gleiche Ergebnis. Warum das?
Elelias

Ich müsste den Index sehen, aber ich vermute, dass der Index nicht numerisch ist. In diesem Fall kann sich der Zugriff über eine Ganzzahl wie ein Index und nicht wie ein Schlüssel verhalten. Dies liegt daran, dass es keine Unklarheiten gibt, wonach Sie fragen, wenn Sie danach fragen Something(["A", "B", "C"])[1], aber was möchten Sie, wenn Sie haben Something([1,2,3,4])[1]? Lesen Sie die verschiedenen Abschnitte hier in den Dokumenten zu einigen der damit verbundenen Kopfschmerzen.
DSM

Wie verwende ich df ['xxx'] [df.index [0]] für einen Float? Ich habe einen Float 56.7888 und er wurde auf 56 anstatt auf 57
umgestellt

1
Anrufen iget()gibt 'Series' object has no attribute 'iget'.
Suzana

15

Kombinieren der Antwort von @ comte und der Antwort von dmdip in Get index einer Zeile eines Pandas-Datenrahmens als Ganzzahl

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

gibt Ihnen den Wert des Index.


Beachten Sie, dass Indizes nicht immer gut definiert sind, unabhängig davon, ob sie mehrfach oder einfach indiziert sind. Das Ändern von Datenrahmen mithilfe von Indizes kann zu unerwartetem Verhalten führen. Wir werden ein Beispiel mit einem Fall mit mehreren Indizes haben, aber beachten Sie, dass dies auch in einem Fall mit einem einzelnen Index zutrifft .

Sagen wir, wir haben

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

Der Versuch , das letzte Element mit dem Index für den Zugriff auf df[12, "y"]Ausbeuten

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

Wenn Sie versuchen, den Datenrahmen basierend auf dem Index zu ändern (12, y), ändern Sie zwei Zeilen anstelle einer. Obwohl wir gelernt haben, auf den Wert des Index der letzten Zeile zuzugreifen, ist es möglicherweise keine gute Idee, wenn Sie die Werte der letzten Zeile basierend auf ihrem Index ändern möchten, da es möglicherweise viele gibt, die denselben Index verwenden. df.iloc[-1]In diesem Fall sollten Sie jedoch auf die letzte Zeile zugreifen.

Referenz

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


7
df.tail(1).index 

scheint am lesbarsten


Dies gibt keine Zahl zurück, sondern: RangeIndex (Start = 6, Stopp = 7, Schritt = 1)
Alexander

5
Alex: aus dem zurückgegebenen index, die start=6anzeigt , das des letzten Elements versetzt sind . Also, df.tail(1)bekommt das letzte Element, df["your_column"][6]wäre das letzte Element, für your_column, etc (aber df.last_valid_index()gibt Ihnen nur die Nummer)
Michael

2

Es kann jetzt zu spät sein. Ich verwende die indexMethode, um den letzten Index eines DataFrame abzurufen, und verwende dann [-1], um die letzten Werte abzurufen :

Zum Beispiel,

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

Die Ausgabe ist

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

2

Sie möchten .iloc mit doppelten Klammern.

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

Sie geben .iloc eine Liste von Indizes - insbesondere den ersten und den letzten [0, -1]. Das gibt einen Datenrahmen zurück, von dem Sie nach der Spalte 'Datum' fragen. ['Datum'] gibt Ihnen eine Reihe ( yuck ) und [['Datum']] gibt Ihnen einen Datenrahmen.


0

Pandas unterstützt die NumPy-Syntax, die Folgendes ermöglicht:

df[len(df) -1:].index[0]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.