2016-12-15 13 views
1

をスワップ私はこのようになりますデータフレームがあります。パイソン - パンダのデータフレームの列が

| 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 

を、私はこれにそれを変更したい:

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 

のでmultindexとして列に変換しますよく

お願いします。

があります。そのような種類のものを正確に説明する良いチュートリアルがありますので、試してもエラーでもできません。

はあなたに

EDITありがとう: 私の最初の元々のデータフレームを次のようになります。

 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 

ので、各セルにタプルがあります。

+0

オリジナルのDataFrameは実際にどのように見えますか?まったく? –

+0

@JohnZwinck元のデータフレームを編集して追加しました。 – TheDaJon

+0

元のデータフレームを必要な出力に変更したいのですか? –

答えて

2

あなたが最初DataFrame.from_recordsを使用することができ、その後、reset_indexを倍増し、必要に応じsort_valuesであれば、すべての列をソートするための:

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 

をごDataFrameが列にMultiIndexである場合には、必要stack最初:

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 
関連する問題