2017-05-29 153 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,我不能将两个答案都标记为正确。 –