Unmelt Pandas DataFrame
Habe ich ein pandas dataframe mit zwei id-Variablen:
df = pd.DataFrame({'id': [1,1,1,2,2,3],
'num': [10,10,12,13,14,15],
'q': ['a', 'b', 'd', 'a', 'b', 'z'],
'v': [2,4,6,8,10,12]})
id num q v
0 1 10 a 2
1 1 10 b 4
2 1 12 d 6
3 2 13 a 8
4 2 14 b 10
5 3 15 z 12
Kann ich die pivot-Tabelle mit:
df.pivot('id','q','v')
Und am Ende mit etwas in der Nähe von:
q a b d z
id
1 2 4 6 NaN
2 8 10 NaN NaN
3 NaN NaN NaN 12
Jedoch, was ich wirklich will ist (das original unmelted form):
id num a b d z
1 10 2 4 NaN NaN
1 12 NaN NaN 6 NaN
2 13 8 NaN NaN NaN
2 14 NaN 10 NaN NaN
3 15 NaN NaN NaN 12
In anderen Worten:
- 'id' und 'num' meine Indizes (normalerweise habe ich nur gesehen, entweder 'id' oder 'num' als der index, aber ich brauche beide, da bin ich beim abrufen der ursprünglichen unmelted form)
- 'q' sind meine Spalten
- 'v' sind meine Werte in der Tabelle
Update
Fand ich eine schließen Lösung von Wes McKinney ' s blog:
df.pivot_table(index=['id','num'], columns='q')
v
q a b d z
id num
1 10 2 4 NaN NaN
12 NaN NaN 6 NaN
2 13 8 NaN NaN NaN
14 NaN 10 NaN NaN
3 15 NaN NaN NaN 12
Jedoch, das format ist nicht ganz das gleiche wie das, was ich oben soll.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du bist wirklich in der Nähe slaw. Nur benennen Sie Ihre Spalte index auf Keine und haben Sie was Sie wollen.
Hinweis, dass die 'v' - Spalte wird erwartet, dass numerische standardmäßig so, dass Sie aggregiert werden können. Ansonsten Pandas Fehler raus:
Zum beheben dieses, Sie können Ihre eigenen aggregation-Funktion mithilfe einer benutzerdefinierten lambda-Funktion:
df.columns.name
konnte aber nicht herausfinden, wie zu verwendenrename
angemessen. Vielen Dank für Ihre Hilfe!Könnten Sie
set_index
undunstack
del df2.columns.name
.Sie können entfernen Sie den Namen q.
Null Antwort + entfernen q =
Kam mit einer Lösung schließen
Kann immer noch nicht herausfinden können, wie man 'q' aus dem dataframe
Das könnte gut funktionieren:
df2 = (df.pivot_table(index=['id', 'num'], columns='q', values='v')).reset_index())
df2.columns =[s1 + str(s2) for (s1,s2) in df2.columns.tolist()]
Es getan werden kann in drei Schritte:
Dies ist ein Ergebnis, aber mit anderer Reihenfolge der Spalten:
Alternativ mit der richtigen Reihenfolge: