2016-10-07 3 views
3

Ich habe versucht, meine Datenrahmen neu anordnen, um es als Eingabe für ein Faktorplot verwenden. Die Rohdaten würde wie folgt aussehen:Pandas Datenrahmen Umlagerung Stack zu zwei Wert Spalten (für factorplots)

A B C D 
1 0 1 2 "T" 
2 1 2 3 "F" 
3 2 1 0 "F" 
4 1 0 2 "T" 
... 

Meine Frage ist, wie kann ich es in dieser Form neu anordnen:

col val val2 
1 A 0 "T" 
1 B 1 "T" 
1 C 2 "T" 
2 A 1 "F" 
... 

Ich habe versucht:

df = DF.cumsum(axis=0).stack().reset_index(name="val") 

jedoch erzeugt dies nur ein Wertspalte nicht zwei .. danke für Ihre Unterstützung

+0

Haben Sie 'cumsum' auf den Werten ausgeführt werden soll und es dann nach Ihren gewünschten' DF' neu zu gestalten oder einfach die Werte neu zu gestalten, ohne dass die Durchführung 'Cumsum'-Operation, weil Sie Antworten für den letzteren Fall haben? –

Antwort

1

betrachten Sie Ihren Datenrahmen df

df = pd.DataFrame([ 
     [0, 1, 2, 'T'], 
     [1, 2, 3, 'F'], 
     [2, 1, 3, 'F'], 
     [1, 0, 2, 'T'], 
    ], [1, 2, 3, 4], list('ABCD')) 

enter image description here

Lösung

df.set_index('D', append=True) \ 
    .rename_axis(['col'], 1) \ 
    .rename_axis([None, 'val2']) \ 
    .stack().to_frame('val') \ 
    .reset_index(['col', 'val2']) \ 
    [['col', 'val', 'val2']] 

enter image description here

3

Ich würde Schmelze verwenden, und Sie können es sortieren, wie auch immer Sie mögen

pd.melt(df.reset_index(),id_vars=['index','D'], value_vars=['A','B','C']).sort_values(by='index') 
Out[40]: 
    index D variable value 
0  1 T  A  0 
4  1 T  B  1 
8  1 T  C  2 
1  2 F  A  1 
5  2 F  B  2 
9  2 F  C  3 
2  3 F  A  2 
6  3 F  B  1 
10  3 F  C  0 
3  4 T  A  1 
7  4 T  B  0 
11  4 T  C  2 

dann nennen Sie können natürlich Spalte, wie Sie

wie
df.set_index('index').rename(columns={'D': 'col', 'variable': 'val2', 'value': 'val'}) 
+0

Größenordnung besser als meine Antwort – piRSquared

+0

@pirsquared schätzen, dass von Ihnen kommen! –

Verwandte Themen