Pandas列值转换为列?

97

我看到过几种在Pandas数据帧中将列/系列爆炸成多个列的主题变化,但我一直试图做某事,并没有真正成功现有方法。

给定如下的DataFrame:

    key       val
id
2   foo   oranges
2   bar   bananas
2   baz    apples
3   foo    grapes
3   bar     kiwis

我想将key系列中的项目转换为列,val值作为值,如下所示:

        foo        bar        baz
id
2   oranges    bananas     apples
3    grapes      kiwis        NaN

我觉得这应该是相对简单的事情,但是我已经花费几个小时了,越来越复杂,没有成功。

2个回答

145

有几种方法:

使用.pivot_table函数:

>>> df.pivot_table(values='val', index=df.index, columns='key', aggfunc='first')
key      bar     baz      foo
id                           
2    bananas  apples  oranges
3      kiwis     NaN   grapes

使用.pivot

>>> df.pivot(index=df.index, columns='key')['val']
key      bar     baz      foo
id                           
2    bananas  apples  oranges
3      kiwis     NaN   grapes

使用.groupby方法,然后接着使用.unstack方法:

>>> df.reset_index().groupby(['id', 'key'])['val'].aggregate('first').unstack()
key      bar     baz      foo
id                           
2    bananas  apples  oranges
3      kiwis     NaN   grapes

1
@behzad.nouri,您能否扩展一下,如果原始数据中有另外一个要保留的列,比如说原始数据中还有一列C,该怎么处理? - Tommy
1
@Tommy 将你想要保留的列添加到索引中。例如,df.pivot_table(values='val', index=['colA','colB'], columns='key', aggfunc='first')。 - Juha Palomäki

10
你可以使用set_indexunstack
In [1923]: df.set_index([df.index, 'key'])['val'].unstack()
Out[1923]:
key      bar     baz      foo
id
2    bananas  apples  oranges
3      kiwis    None   grapes

或者,一个简化的groupby
In [1926]: df.groupby([df.index, 'key'])['val'].first().unstack()
Out[1926]:
key      bar     baz      foo
id
2    bananas  apples  oranges
3      kiwis    None   grapes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接