2017-07-26 1 views
2

Ich habe einen Datenrahmenkonsekutiv nächster Wert in neue Spalt Pandas Datenrahmen

id value 
v1  100 
v1  200 
v1  300 
v1  400 
v2  500 
v2  600 
v2  700 
v3  800 
v3  900 

i Datenrahmen in neuen Datenrahmen DF2 zu verwandeln suchen:

id val1 val2 
v1  100  200 
v1  200  300 
v1  300  400 
v1  400  100 
v2  500  600 
v2  600  700 
v2  700  500 
v3  800  900 
v3  900  800 

also den nächsten Mal in Folge Wert in der nächsten Spalte verschieben und auch eine Art von Gruppierung von IDs,

ich versuchte mit df.shift(), aber nicht funktioniert.

Gibt es eine Alternative dazu?

Antwort

4

Wir wollen np.roll verwenden, um die Aufgabe innerhalb von Gruppen zu erreichen. Durch die Verwendung von transform umgehen wir das Auflegen des internen Gruppenindex.

df.groupby('id').value.transform(np.roll, shift=-1) 

0 200 
1 300 
2 400 
3 100 
4 600 
5 700 
6 500 
7 900 
8 800 
Name: value, dtype: int64 

Wir können eine neue Spalte mit einer Kopie von df mit assign

df.assign(val2=df.groupby('id').value.transform(np.roll, shift=-1)) 

    id value val2 
0 v1 100 200 
1 v1 200 300 
2 v1 300 400 
3 v1 400 100 
4 v2 500 600 
5 v2 600 700 
6 v2 700 500 
7 v3 800 900 
8 v3 900 800 

hinzufügen oder eine neue Spalte direkt an df anstelle

df['val2'] = df.groupby('id').value.transform(np.roll, shift=-1) 

df 

    id value val2 
0 v1 100 200 
1 v1 200 300 
2 v1 300 400 
3 v1 400 100 
4 v2 500 600 
5 v2 600 700 
6 v2 700 500 
7 v3 800 900 
8 v3 900 800 
+0

Sir, meine ID-Spalte ist kein Integer-Typ, siehe meinen bearbeiteten Datenrahmen. Beim Ausführen von df.groupby(). Value, Ihrer ersten Codezeile, erhalte ich einen Fehler: ''DataFrameGroupBy' Objekt hat kein Attribut 'value'' – Shubham

+0

@SRingne, das das Ergebnis überhaupt nicht beeinflussen sollte. Dieser Fehler ist ein Hinweis darauf, dass die Spalte namens "Wert" nicht in "df" steht. Bitte bestätigen Sie, dass es ist oder nicht. – piRSquared

+0

funktioniert! eigentlich habe ich den Spaltennamen falsch geschrieben! Danke vielmals! – Shubham

4

Ich glaube, Sie brauchen numpy.roll:

df['val2'] = df.groupby('id')['value'].apply(lambda x: pd.Series(np.roll(x, -1))).values 
print (df) 
    id value val2 
0 1 100 200 
1 1 200 300 
2 1 300 400 
3 1 400 100 
4 2 500 600 
5 2 600 700 
6 2 700 500 
7 3 800 900 
8 3 900 800 
+0

die id-Spalte hinzufügen, ist keine ganze Zahl. Bitte siehe Bearbeiten. Ich erhalte Fehler: 'inkompatibler Index der eingefügten Spalte mit Rahmenindex' – Shubham

+0

Hmmm, wenn Werte am Ende haben, funktioniert es nicht? – jezrael

+0

Sir es gibt den oben genannten Fehler. 'type (df ['id'] [0]) = 'str' und type (df ['wert'] [0]) = numpy.int64' – Shubham

Verwandte Themen