Wechseln zwischen nächstem/vorherigem Index in Pandas DataFrame

Ausgehen von einem DataFrame und einem gegebenen Index (Label), würde ich gerne zum nächsten oder vorherigen Index wechseln können:

df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}, index=['a', 'b', 'c'])
#    A  B  C
# a  1  4  7
# b  2  5  8
# c  3  6  9
filter = df[df.A == 1]
filter_idx = filter.iloc[0].name

In diesem (einfachen) Beispiel "suche" ich in dem DataFrame nach allen Items mit A == 1 . Anschliessend hole ich den Label Index des ersten Items in diesem DataFrame. Ausgehend von diesem Index, würde ich jetzt gerne zu dem vorherigen bzw. nächsten Index navigieren können.

Noch keine Stimmen abgegeben
Noch keine Kommentare
  • 14 Apr. 2023

    Am einfachsten benutzen wir dazu die Funktion get_loc , die zu einem Index-Label den zugehörigen numerischen Index zurückgibt:

    # aktuellen "Label"-Index holen
    label = filter.iloc[0].name # => a
    # zugehörigen Integer-Index holen
    index = filter.index.get_loc(label) # => 0
    

    Über iloc[0] greifen wir auf den ersten Datensatz zu und holen den Label-Index (in diesem Fall wäre es "a") und anschliessend damit über get_loc den numerischen Index (hier wäre es "0"). Damit können wir leicht zum vorherigen oder nächsten Datensatz navigieren:

    # Datensatz zurück (in diesem Fall macht es keinen Sinn, da index == 0
    data_prev = filter.iloc[index - 1]
    # Datensatz nach vorne
    data_next = filter.iloc[index + 1]
    

    Natürlich wird get_loc einen unterschiedlichen Wert zurückgeben, je nachdem in welchem Datensatz wir die Funktion anwenden. Hier nochmal das gleiche Beispiel, mit etwas anderem "filter":

    # Filtern mit Zeile mit A == 2 
    filter = df[df.A == 2]
    # => # b  2  5  8
    label = filter.iloc[0].name
    

    Lassen wir uns den numerischen Index in dem nicht gefilterten DataFrame df bzw. in dem gefilterten filter zurückgeben, so bekommen wir unterschiedliche Werte:

    idx_orig = df.index.get_loc(label) # => 1
    idx_filter = filter.index.get_loc(label) # => 0
    
    Noch keine Stimmen abgegeben
    Noch keine Kommentare