Was ist der beste Weg, um den folgenden Datenrahmen in Pandas umzuformen? Dieser Datenrahmen df
hat x,y
Werte für jede Probe (s1
und s2
in diesem Fall) und wie folgt aussieht:Umgestaltung von Datenrahmen in Pandas basierend auf Spaltenbeschriftungen
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
die x/y sind Werte für Probe 1, s2_x, s2_y
die Abtastwerte für Probe 2 usw. Wie kann dies in einen Datenrahmen umgeformt werden, der nur x
, y
Spalten enthält, aber eine zusätzliche Spalte sample
enthält, die für jede Zeile im Datenrahmen angibt, ob sie von s1
oder s2
stammt? Z.B.
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 Dinge mit Rpy2 Plotten später, da viele R Plotten Funktionen Verwendung dieser Gruppenvariable machen, so dass meine Motivation ist den Datenrahmen zum Umformen.
Ich denke, die Antwort von Chang Ihnen gegeben nicht zu Datenrahmen übersetzen, die einen eindeutigen Index haben, 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
Die Transformation gearbeitet, aber in dem Prozess die Spalte "names"
verloren war. Wie kann ich die Spalte in der df behalten, während noch die Schmelztransformation auf den Spalten durchgeführt wird, die _
in ihren Namen haben? Die Spalte weist jeder Zeile im Datenrahmen nur einen eindeutigen Namen zu. Es ist hier zum Beispiel numerisch, aber in meinen Daten sind sie String-Identifier.
danke.
Könnten Sie den 'reset_index' Anruf erklären und was es hier tut? Ist es auch möglich, den 'level_1' Index zu entfernen? Ich sehe auch nicht, wie ich auf die Beschriftungsspalten für jede Zeile mit dieser – user248237dfsf
zugreifen kann. Auch, wenn der Datenrahmen einen eindeutigen Index hat, um zu beginnen? – user248237dfsf
Nach dem Aufruf zum Stapeln ist "s1 s2 s1 s2 ..." Teil der Zeilenbeschriftungen (Index). reset_index erstellt stattdessen einfach eine Spalte. Danach ist es immer noch ein DataFrame, so dass der Index/Spaltenzugriff immer noch derselbe ist. –