2016-12-15 11 views
1

ich einen Datenrahmen haben, die wie folgt aussieht:Python - Pandas Datenrahmen Spalten tauschen

| A  |  B  |  C  |  D 
0 | a | b | c | d | e | f | g | h 
1 | a | b | c | d | e | f | NaN | NaN 
2 | a | b | NaN | NaN | e | f | NaN | NaN 
3 | a | b | NaN | NaN | NaN | NaN | NaN | NaN 

und ich möchte es, dies zu ändern:

OBJ VAL1 VAL2 
0 A  a  b 
1 A  a  b 
2 A  a  b 
3 A  a  b 
4 A  a  b 
5 A  a  b 
6 B  c  d 
7 B  c  d 
8 C  e  f 
9 C  e  f 
10 C  e  f 
11 D  g  h 

so die multindex auf eine Säule konvertiert als Gut.

Hilfe bitte?

und gibt es ein gutes Tutorial, das genau diese Art von Sachen erklärt, so werde ich in der Lage sein, es zu tun und nicht nur versuchen und Fehler?

Danke

EDIT: Mein erster ursprünglich Datenrahmen wie folgt aussieht:

 A  B  C  D 
0 (a,b) (c,d) (e,f) (g,h) 
1 (a,b) (c,d) (e,f) NaN 
2 (a,b) NaN (e,f) NaN 
3 (a,b) NaN  NaN  NaN 

so in jeder Zelle ein Tupel ist.

+0

Wie sieht Ihr ursprünglicher Dataframe eigentlich aus? Genau? –

+0

@JohnZwinck Ich habe den ursprünglichen Datenrahmen bearbeitet und hinzugefügt. – TheDaJon

+0

Sie möchten also den ursprünglichen Datenrahmen in die gewünschte Ausgabe umwandeln? –

Antwort

2

Sie können DataFrame.from_records verwenden zuerst, dann reset_index verdoppeln und ggf. sort_values zum Sortieren aller Spalten:

df = pd.DataFrame({"A": [('a','b'),('a','b'),('a','b'),('a','b')], 
        'B': [('c','d'),('c','d'), np.nan,np.nan], 
        'C':[('e','f'),('e','f'),('e','f'),np.nan], 
        'D':[('g','h'),np.nan,np.nan,np.nan]}) 
print (df) 
     A  B  C  D 
0 (a, b) (c, d) (e, f) (g, h) 
1 (a, b) (c, d) (e, f)  NaN 
2 (a, b)  NaN (e, f)  NaN 
3 (a, b)  NaN  NaN  NaN 

stacked = df.stack() 
df1 = pd.DataFrame.from_records(stacked.tolist(), index = stacked.index) 
     .reset_index(level=0, drop=True) 
     .reset_index() 
     .sort_values(['index',0,1]) 
df1.columns = ['OBJ','VAL1','VAL2'] 
print (df1) 
    OBJ VAL1 VAL2 
0 A a b 
4 A a b 
7 A a b 
9 A a b 
1 B c d 
5 B c d 
2 C e f 
6 C e f 
8 C e f 
3 D g h 

Wenn Ihr DataFrame mit MultiIndex in Spalten ist, müssen stack zuerst:

stacked = df.stack() 
df1 = pd.DataFrame.from_records(stacked.tolist(), index = stacked.index) \ 
     .unstack(1) \ 
     .swaplevel(0, 1, 1) \ 
     .sort_index(axis=1) \ 
     .replace({None:np.nan}) 

print (df1) 
    A  B   C   D  
    0 1 0 1 0 1 0 1 
0 a b c d e f g h 
1 a b c d e f NaN NaN 
2 a b NaN NaN e f NaN NaN 
3 a b NaN NaN NaN NaN NaN NaN 

df2 = df1.stack(0) 
     .reset_index(level=0, drop=True) 
     .reset_index() 
     .sort_values(['index',0,1]) 

df2.columns = ['OBJ','VAL1','VAL2'] 
print (df2) 
    OBJ VAL1 VAL2 
0 A a b 
4 A a b 
7 A a b 
9 A a b 
1 B c d 
5 B c d 
2 C e f 
6 C e f 
8 C e f 
3 D g h 
Verwandte Themen