熊猫列值到列?

我已经看到了一些关于将一个列/系列扩展为熊猫数据框架的多个列的变体,但是我一直在尝试做一些事情,但是用现有的方法并没有真正成功。

给定一个这样的数据框架:

    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

我觉得这个问题应该相对简单一些,但是我已经花了好几个小时在这个问题上纠结了好几个小时,都没有结果。

70667 次浏览

There are a few ways:

using .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

using .pivot:

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

using .groupby followed by .unstack:

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

You could use set_index and unstack

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

Or, a simplified 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