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?

elelias
quelle

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
DSM
quelle
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

Tai
quelle
7
df.tail(1).index 

scheint am lesbarsten

comte
quelle
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
Yoonghm
quelle
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.

grofte
quelle
0

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

df[len(df) -1:].index[0]
Quantum
quelle