Richtiger Weg, um pandas.DataFrame umzukehren?

117

Hier ist mein Code:

import pandas as pd

data = pd.DataFrame({'Odd':[1,3,5,6,7,9], 'Even':[0,2,4,6,8,10]})

for i in reversed(data):
    print(data['Odd'], data['Even'])

Wenn ich diesen Code ausführe, wird folgende Fehlermeldung angezeigt:

Traceback (most recent call last):
  File "C:\Python33\lib\site-packages\pandas\core\generic.py", line 665, in _get_item_cache
    return cache[item]
KeyError: 5

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\*****\Documents\******\********\****.py", line 5, in <module>
    for i in reversed(data):
  File "C:\Python33\lib\site-packages\pandas\core\frame.py", line 2003, in __getitem__
    return self._get_item_cache(key)
  File "C:\Python33\lib\site-packages\pandas\core\generic.py", line 667, in _get_item_cache
    values = self._data.get(item)
  File "C:\Python33\lib\site-packages\pandas\core\internals.py", line 1656, in get
    _, block = self._find_block(item)
  File "C:\Python33\lib\site-packages\pandas\core\internals.py", line 1936, in _find_block
    self._check_have(item)
  File "C:\Python33\lib\site-packages\pandas\core\internals.py", line 1943, in _check_have
    raise KeyError('no item named %s' % com.pprint_thing(item))
KeyError: 'no item named 5'

Warum erhalte ich diesen Fehler?
Wie kann ich das beheben?
Was ist der richtige Weg, um umzukehren pandas.DataFrame?

Michael
quelle
3
Welche Ausgabe suchen Sie? "One"ist keine Spalte in dataund ich weiß nicht, ob Twoes sich um eine Variable oder einen Tippfehler handelt "Two", der auch keine Spalte ist. Möchten Sie nur die Spaltenreihenfolge umkehren?
DSM
Meinten Sie data[["Odd", "Even"]]oder allgemeiner data[data.columns[::-1]]?
Fred Foo
1
Sie haben noch kein Beispiel für die gewünschte Ausgabe angegeben. Ich weiß, wie man das umgeht, reversed(data)funktioniert nicht, aber ich weiß nicht, warum Sie das Ganze Oddund die EvenSpalten einmal für jede Spalte im Frame drucken möchten, was Ihr Code tun würde, wenn Sie ihn verwenden würden reversed(list(data)).
DSM
Ich möchte für Schleife am Ende meines dataFrame
Michael
2
Dann denke ich, dass Ihre Frage ein Dup von dieser ist , und Sie wollen so etwas for i, row in data[::-1].iterrows(): print row["Odd"], row["Even"]. Bitte geben Sie in Ihrer Frage immer Beispiele für die erwartete Ausgabe an. es macht das Leben für alle viel einfacher.
DSM

Antworten:

244
data.reindex(index=data.index[::-1])

oder einfach:

data.iloc[::-1]

wird Ihren Datenrahmen umkehren, wenn Sie eine forSchleife haben möchten, die von unten nach oben geht, können Sie Folgendes tun:

for idx in reversed(data.index):
    print(idx, data.loc[idx, 'Even'], data.loc[idx, 'Odd'])

oder

for idx in reversed(data.index):
    print(idx, data.Even[idx], data.Odd[idx])

Sie erhalten einen Fehler , da reversederste Anrufe , data.__len__()die 6. Dann kehrt sie zu rufen versucht , data[j - 1]für jin range(6, 0, -1)und der erste Aufruf sein würde data[5]; In Pandas data[5]bedeutet Datenrahmen jedoch Spalte 5, und es gibt keine Spalte 5, sodass eine Ausnahme ausgelöst wird. (siehe Dokumente )

behzad.nouri
quelle
Wenn Sie Probleme haben, können Sie dies versuchen:for index, row in df.iloc[::-1].iterrows():
Kristian
Wie kann man das an Ort und Stelle machen ? Äquivalent der data.reindex(index=data.index[::-1], inplace=True)
Hypothese
3
Kann data = data.reindex(index=data.index[::-1])dann data.reset_index(inplace=True, drop=True)und es wird an Ort und Stelle zurückgesetzt.
Matts
4
Ist df = df[::-1]eine pythonische und gültige Lösung?
Tommy.carstensen
@ Tommy.carstensen ja, und es sollte die beste Antwort sein
Rosstripi
65

Sie können die Zeilen noch einfacher umkehren:

df[::-1]
user1951
quelle
3
Ich definiere gerne meine eigene reverse()Methode mit, pd.Series.reverse = pd.DataFrame.reverse = lambda self: self[::-1]weil sie beim Verketten von Methoden besser aussieht, z df.reverse().iterrows().
Ben Mares
4

Keine der vorhandenen Antworten setzt den Index nach dem Umkehren des Datenrahmens zurück.

Gehen Sie dazu wie folgt vor:

 data[::-1].reset_index()

Hier ist eine Dienstprogrammfunktion , die gemäß @ Tims Kommentar auch die alte Indexspalte entfernt:

def reset_my_index(df):
  res = df[::-1].reset_index(drop=True)
  return(res)

Übergeben Sie einfach Ihren Datenrahmen an die Funktion

Kybernetisch
quelle
1
Sie möchten wahrscheinlich haben drop=True, dh data[::-1].reset_index(drop=True):, sonst wird der alte Index als Spalte im DataFrame hinzugefügt.
Tim
Warum willst du das tun?
Endolith
@endolith Einige Bibliotheken erwarten, dass der Datenrahmen indiziert wird. Beispielsweise erwarten einige Zeitreihen-Prognosebibliotheken einen indizierten Frame als Eingabe, damit eine Zeitreihe modelliert werden kann, während sie unabhängig vom Zeitschritt (Tag, Monat, Jahr usw.) bleibt. Wenn Sie also mit einem Datenrahmen arbeiten, führen Sie eine Transformation durch, die die Indizierung durcheinander bringt. Es ist üblich, den Rahmen so neu zu indizieren.
Kybernetisch
1

Das funktioniert:

    for i,r in data[::-1].iterrows():
        print(r['Odd'], r['Even'])
Michael Styrk
quelle