Umgestaltung dataframes in pandas basierend auf der Spalte-Beschriftungen
Was ist der beste Weg zur Neugestaltung der folgenden dataframe in pandas? Dieser DataFrame df
hat x,y
Werte für jede Probe (s1
und s2
in diesem Fall) und sieht wie folgt aus:
In [23]: df = pandas.DataFrame({"s1_x": scipy.randn(10), "s1_y": scipy.randn(10), "s2_x": scipy.randn(10), "s2_y": scipy.randn(10)})
In [24]: df
Out[24]:
s1_x s1_y s2_x s2_y
0 0.913462 0.525590 -0.377640 0.700720
1 0.723288 -0.691715 0.127153 0.180836
2 0.181631 -1.090529 -1.392552 1.530669
3 0.997414 -1.486094 1.207012 0.376120
4 -0.319841 0.195289 -1.034683 0.286073
5 1.085154 -0.619635 0.396867 0.623482
6 1.867816 -0.928101 -0.491929 -0.955295
7 0.920658 -1.132057 1.701582 -0.110299
8 -0.241853 -0.129702 -0.809852 0.014802
9 -0.019523 -0.578930 0.803688 -0.881875
s1_x
und s1_y
sind die x/y-Werte für Stichprobe 1, s2_x, s2_y
werden die sample-Werte für Beispiel 2, usw. Wie kann das sein umgestaltet in einen DataFrame mit nur x
, y
Spalten, sondern enthält eine zusätzliche Spalte sample
sagt für jede Zeile des DataFrame, ob es aus s1
oder s2
? E. g.
x y sample
0 0.913462 0.525590 s1
1 0.723288 -0.691715 s1
2 0.181631 -1.090529 s1
3 0.997414 -1.486094 s1
...
5 0.396867 0.623482 s2
...
Dies ist nützlich für das zeichnen Dinge mit Rpy2 später auf, da viele R Plotten Funktionen können mit dieser Gruppierung variable, also das ist meine motivation für die Neugestaltung des dataframe.
Ich denke, die Antwort gegeben, die von Chang, die Sie nicht übersetzen, dataframes, die einen eindeutigen index, wie diese:
In [636]: df = pandas.DataFrame({"s1_x": scipy.randn(10), "s1_y": scipy.randn(10), "s2_x": scipy.randn(10), "s2_y": scipy.randn(10), "names": range(10)})
In [637]: df
Out[637]:
names s1_x s1_y s2_x s2_y
0 0 0.672298 0.415366 1.034770 0.556209
1 1 0.067087 -0.851028 0.053608 -0.276461
2 2 -0.674174 -0.099015 0.864148 -0.067240
3 3 0.542996 -0.813018 2.283530 2.793727
4 4 0.216633 -0.091870 -0.746411 -0.421852
5 5 0.141301 -1.537721 -0.371601 -1.594634
6 6 1.267148 -0.833120 0.369516 -0.671627
7 7 -0.231163 -0.557398 1.123155 0.865140
8 8 1.790570 -0.428563 0.668987 0.632409
9 9 -0.820315 -0.894855 0.673247 -1.195831
In [638]: df.columns = pandas.MultiIndex.from_tuples([tuple(c.split('_')) for c in df.columns])
In [639]: df.stack(0).reset_index(1)
Out[639]:
level_1 x y
0 s1 0.672298 0.415366
0 s2 1.034770 0.556209
1 s1 0.067087 -0.851028
1 s2 0.053608 -0.276461
2 s1 -0.674174 -0.099015
2 s2 0.864148 -0.067240
3 s1 0.542996 -0.813018
3 s2 2.283530 2.793727
4 s1 0.216633 -0.091870
4 s2 -0.746411 -0.421852
5 s1 0.141301 -1.537721
5 s2 -0.371601 -1.594634
6 s1 1.267148 -0.833120
6 s2 0.369516 -0.671627
7 s1 -0.231163 -0.557398
7 s2 1.123155 0.865140
8 s1 1.790570 -0.428563
8 s2 0.668987 0.632409
9 s1 -0.820315 -0.894855
9 s2 0.673247 -1.195831
Der transformation gearbeitet, aber in den Prozess der Spalte "names"
war verloren. Wie kann ich die "names"
Spalte in der df noch dabei den Schmelz-transformation auf die Spalten, die _
" in Ihrem Namen? Die "names"
Spalte genau weist einen eindeutigen Namen, um jede Zeile des dataframe. Es ist numerische hier zum Beispiel, aber in meinen Daten sind Sie string-Bezeichner.
Dank.
InformationsquelleAutor user248237dfsf | 2013-02-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, Sie haben bereits den DataFrame. In dem Fall können Sie einfach drehen Sie die Spalten in ein MultiIndex und verwenden von stack dann reset_index. Beachten Sie, dass Sie dann umbenennen und die Reihenfolge der Spalten und die Sortierung nach sample zu bekommen genau was du gepostet hast in die Frage:
Können Sie speichern Sie die MultiIndex-Konvertierung, wenn Sie können einfach erstellen Sie das DataFrame mit einem MultiIndex statt.
Bearbeiten: verwenden Sie merge, join original-ids zurück in
Alternativ:
reset_index
anrufen und was tut es hier? Auch ist es möglich, um loszuwerden, daslevel_1
index? Ich sehe auch nicht, wie kann ich den Zugriff auf die Bezeichnungen der Spalten für jede Zeile mit dieserAuch, was ist, wenn der dataframe hat einen eindeutigen index zu starten?
Nach dem Aufruf-stack", s1 s2 s1 s2 ..." ist Teil der Reihe Etiketten (index). reset_index einfach macht es eine Spalte statt. Nach dieser ist es noch ein DataFrame so index/Spalten-Zugriff ist immer noch die gleiche.
Ich veränderte meine Frage zu reflektieren, die ein problem mit dieser Lösung für eindeutig indiziert dataframes. Sie haben eine Idee, wie diese Lösung angepasst werden können, um diese an? danke
Wenn das der Fall ist, verwenden Sie Zusammenführen, oder legen Sie den Namen des index, um mit zu beginnen. Ich aktualisiere die Lösung mit diesem
InformationsquelleAutor Chang She