2016-12-15 95 views
1

我有一個數據幀,看起來像這樣:的Python - 熊貓據幀列交換

| 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將轉換爲列好。

請幫忙嗎?

是否有任何好的教程,解釋確切的那些東西,所以我將能夠做到這一點,而不只是嘗試和錯誤?

謝謝

編輯: 我的第一個原本數據幀是這樣的:

 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 ACTUALLY是什麼樣的?究竟? –

+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