2017-05-29 109 views
4

我有一個太多的「緊湊」形式的DataFrame。數據幀是目前這樣的:Unstack dataframe並保留列

> import numpy as np 
> import pandas as pd 

> df = pd.DataFrame({'foo': ['A','B'], 
       'bar': ['1', '2'], 
       'baz': [np.nan, '3']}) 
    bar baz foo 
0 1 NaN A 
1 2 3 B 

,我需要「拆散」它是像這樣:

> df = pd.DataFrame({'foo': ['A','B', 'B'], 
       'type': ['bar', 'bar', 'baz'], 
       'value': ['1', '2', '3']}) 

    foo type value 
0 A bar  1 
1 B bar  2 
2 B baz  3 

不管我如何努力轉動,我無法得到它的權利。

回答

4

使用melt()方法:

In [39]: pd.melt(df, id_vars='foo', value_vars=['bar','baz'], var_name='type') 
Out[39]: 
    foo type value 
0 A bar  1 
1 B bar  2 
2 A baz NaN 
3 B baz  3 

In [38]: pd.melt(df, id_vars='foo', value_vars=['bar','baz'], var_name='type').dropna() 
Out[38]: 
    foo type value 
0 A bar  1 
1 B bar  2 
3 B baz  3 
2

設置你的指數爲foo,然後棧:

df.set_index('foo').stack() 

foo  
A bar 1 
B bar 2 
    baz 3 
dtype: object 
+0

這給出了一個系列,而不是一個數據幀 –

+0

@雷米,加入'.reset_index()'會給你想要的結果;-) – MaxU

+0

確實,它也可以。對不起@Steven G,我不能將兩個答案都標記爲正確。 –