(可能已分组)行值到列

时间:2016-10-18 11:58:20

标签: python pandas

让我们说,经过一些groupby操作后,我有一个像这样的数据框:

data = pd.DataFrame(columns=['Key', 'Subkey', 'Value'])
data.loc[0] = ['foo1', 'bar1', 20]
data.loc[1] = ['foo1', 'bar2', 10]
data.loc[2] = ['foo1', 'bar3', 5]
data.loc[3] = ['foo2', 'bar1', 50]
data.loc[4] = ['foo2', 'bar2', 100]
data.loc[5] = ['foo2', 'bar3', 50]

我接下来的是一个如下所示的数据框:

|Key |Subkey | Value |
+----+-------+-------+
|foo1|bar1   |20     |
|foo1|bar2   |10     |
|foo1|bar3   |5      |
|foo2|bar1   |50     |
|foo2|bar2   |100    |
|foo2|bar3   |50     |

我想要的是一个新的数据框,其中子项是一个新列,包含与上面分组框架中相同的值,如:

|Key |bar1 |bar2  |bar3  |
+----+-----+------+------+
|foo1| 20  |  10  | 5    |
|foo2| 50  | 100  | 50   |

是否有单行解决方案,还是需要以编程方式转换数据帧?

1 个答案:

答案 0 :(得分:2)

您可以使用pivot

print (data.pivot(index='Key', columns='Subkey', values='Value'))
Subkey  bar1   bar2  bar3
Key                      
foo1    20.0   10.0   5.0
foo2    50.0  100.0  50.0

然后,您可以将float值转换为intreset_index并删除列名称Subkey

print (data.pivot(index='Key', columns='Subkey', values='Value')
           .astype(int)
           .reset_index()
           .rename_axis(None, axis=1))

    Key  bar1  bar2  bar3
0  foo1    20    10     5
1  foo2    50   100    50