So verschieben Sie eine Spalte in Pandas DataFrame

99

Ich möchte eine Spalte in einem Pandas verschieben DataFrame, konnte jedoch aus der Dokumentation keine Methode finden, ohne den gesamten DF neu zu schreiben. Weiß jemand, wie es geht? DataFrame:

##    x1   x2
##0  206  214
##1  226  234
##2  245  253
##3  265  272
##4  283  291

Gewünschte Ausgabe:

##    x1   x2
##0  206  nan
##1  226  214
##2  245  234
##3  265  253
##4  283  272
##5  nan  291
Wurzel
quelle
3
Dies sollte wirklich ein optionales Flag für die Schaltfunktion sein
KIC

Antworten:

155
In [18]: a
Out[18]: 
   x1  x2
0   0   5
1   1   6
2   2   7
3   3   8
4   4   9

In [19]: a.x2 = a.x2.shift(1)

In [20]: a
Out[20]: 
   x1  x2
0   0 NaN
1   1   5
2   2   6
3   3   7
4   4   8
Eumiro
quelle
8
Das Ergebnis fehlt ## 5. Gibt es bei Pandas eine einfache Möglichkeit, den Index bei Verwendung von Shift zu erweitern?
Waylon Walker
@WaylonWalker Das heißt Rolling in Numpy:df['x2'] = np.roll(df['x2'], 1)
Ayhan
1
Hat jemand das herausgefunden? # 5 fehlt noch
Kritz
Ich muss 100 Spalten auf die gleiche Weise verschieben. Wie kann ich eine for-Schleife erstellen?
Vincent Roye
2
@Johan hast du versucht, am Ende eine leere Zeile hinzuzufügen, bevor du sie verschiebst?
MikeyE
8

Sie müssen df.shifthier verwenden.
df.shift(i)verschiebt den gesamten Datenrahmen um iEinheiten nach unten.

Also für i = 1:

Eingang:

    x1   x2  
0  206  214  
1  226  234  
2  245  253  
3  265  272    
4  283  291

Ausgabe:

    x1   x2
0  Nan  Nan   
1  206  214  
2  226  234  
3  245  253  
4  265  272 

Führen Sie dieses Skript aus, um die erwartete Ausgabe zu erhalten:

import pandas as pd

df = pd.DataFrame({'x1': ['206', '226', '245',' 265', '283'],
                   'x2': ['214', '234', '253', '272', '291']})

print(df)
df['x2'] = df['x2'].shift(1)
print(df)
Ayush Jain
quelle
3
Willkommen beim Stackoverflow. Ihre Antwort ist hilfreicher, wenn Sie erklären, wie sie verwendet werden sollte.
Simon.SA
1
wieder haben Sie eine Reihe # 5 verloren, die OP eindeutig will
KIC
6

Definieren wir den Datenrahmen aus Ihrem Beispiel durch

>>> df = pd.DataFrame([[206, 214], [226, 234], [245, 253], [265, 272], [283, 291]], 
    columns=[1, 2])
>>> df
     1    2
0  206  214
1  226  234
2  245  253
3  265  272
4  283  291

Dann können Sie den Index der zweiten Spalte um manipulieren

>>> df[2].index = df[2].index+1

und schließlich die einzelnen Spalten wieder kombinieren

>>> pd.concat([df[1], df[2]], axis=1)
       1      2
0  206.0    NaN
1  226.0  214.0
2  245.0  234.0
3  265.0  253.0
4  283.0  272.0
5    NaN  291.0

Vielleicht nicht schnell, aber einfach zu lesen. Ziehen Sie in Betracht, Variablen für die Spaltennamen und die tatsächlich erforderliche Verschiebung festzulegen.

Bearbeiten: Im Allgemeinen ist eine Verschiebung möglich, indem, df[2].shift(1)wie bereits veröffentlicht, die Übertragung jedoch abgeschnitten wird.

Kay Wittig
quelle
Ich frage mich, ob es einen schnellen Weg gibt, dies zu tun und einen Datumsindex zu verwenden. Im Wesentlichen möchten Sie verschieben, ohne unsere Reihen abzuschneiden, und daher müssen Sie die zusätzlichen Indexwerte angeben. Für eine Verschiebung um eins würden Sie so etwas wie series.shift (-1, fill = [datetime (<ein Datum>)]] sagen. Ist so etwas möglich? Ah fand es hier stackoverflow.com/questions/36042804/…
OldSchool
5

Wenn Sie die Spalten nicht verlieren möchten, die Sie über das Ende Ihres Datenrahmens hinaus verschieben, fügen Sie einfach zuerst die erforderliche Nummer hinzu:

    offset = 5
    DF = DF.append([np.nan for x in range(offset)])
    DF = DF.shift(periods=offset)
    DF = DF.reset_index() #Only works if sequential index
David Ferris
quelle
3

Ich nehme Importe an

import pandas as pd
import numpy as np

NaN, NaN,...Fügen Sie zuerst eine neue Zeile mit am Ende von DataFrame ( df) hinzu.

s1 = df.iloc[0]    # copy 1st row to a new Series s1
s1[:] = np.NaN     # set all values to NaN
df2 = df.append(s1, ignore_index=True)  # add s1 to the end of df

Es wird ein neuer DF df2 erstellt. Vielleicht gibt es einen eleganteren Weg, aber das funktioniert.

Jetzt können Sie es verschieben:

df2.x2 = df2.x2.shift(1)  # shift what you want
martin-voj
quelle
2

Beim Versuch, ein persönliches und ähnliches Problem zu beantworten, habe ich auf Pandas Doc gefunden, was meiner Meinung nach diese Frage beantworten würde:

DataFrame.shift (Perioden = 1, Frequenz = Keine, Achse = 0) Verschieben Sie den Index um die gewünschte Anzahl von Perioden mit einer optionalen Zeitfrequenz

Anmerkungen

Wenn freq angegeben wird, werden die Indexwerte verschoben, aber die Daten werden nicht neu ausgerichtet. Verwenden Sie also freq, wenn Sie den Index beim Verschieben erweitern und die Originaldaten beibehalten möchten.

Ich hoffe, zukünftige Fragen in dieser Angelegenheit zu helfen.

Tha_franklin
quelle
0

So mache ich es:

df_ext = pd.DataFrame(index=pd.date_range(df.index[-1], periods=8, closed='right'))
df2 = pd.concat([df, df_ext], axis=0, sort=True)
df2["forecast"] = df2["some column"].shift(7)

Grundsätzlich generiere ich einen leeren Datenrahmen mit dem gewünschten Index und verkette sie dann einfach miteinander. Aber ich würde dies wirklich gerne als Standardfunktion bei Pandas sehen, deshalb habe ich eine Verbesserung für Pandas vorgeschlagen.

KIC
quelle