2017-06-17 178 views
6

在大熊猫如何从去:重塑行列大熊猫数据帧

a = pd.DataFrame({'foo': ['m', 'm', 'm', 's', 's', 's'], 
        'bar': [1, 2, 3, 4, 5, 6]}) 
>>> a 
    bar foo 
0 1 m 
1 2 m 
2 3 m 
3 4 s 
4 5 s 
5 6 s 

到B:

b = pd.DataFrame({'m': [1, 2, 3], 
        's': [4, 5, 6]}) 
>>> b 
    m s 
0 1 4 
1 2 5 
2 3 6 

我试图在其他的答案,例如解决方案herehere,但似乎没有做我想要的。

基本上,我想交换行的列和删除索引,但如何做到这一点?

回答

5
a.set_index(
    [a.groupby('foo').cumcount(), 'foo'] 
).bar.unstack() 
+0

您能详细一点这是怎么回事?我查看了GroupBy.cumcount()文档,但它有点神秘。 – PedroA

+1

我对缺乏细节表示歉意。我在打电话。您拥有的信息存在的问题是您需要使用相同的foo值区分不同的值。 Cumcount通过为第一个3创建一个0,1和2,并且为第二个三个创建一个。更重要的是,如果它们的大小不是3,那么它就会起作用。鉴于我设置索引的位置,它完全适用于拆散。 – piRSquared

+0

@piRSquared谢谢你,另外了解set_index – Wen

3

这是我的解决方案

a = pd.DataFrame({'foo': ['m', 'm', 'm', 's', 's', 's'], 
        'bar': [1, 2, 3, 4, 5, 6]}) 
a.pivot(columns='foo', values='bar').apply(lambda x: pd.Series(x.dropna().values)) 

foo m s 
0 1.0 4.0 
1 2.0 5.0 
2 3.0 6.0