我有一个形式为
的pandas dataframe / csvdate Country Type Val
2013-01-01 USA x 23
2013-01-01 USA y 13
2013-01-01 MX x 11
2013-01-01 MX y 14
2013-01-02 USA x 20
2013-01-02 USA y 19
2013-01-02 MX x 14
2013-01-02 MX y 16
我想将其转换为表格
date Country x y
2013-01-01 USA 23 13
2013-01-01 MX 11 14
2013-01-02 USA 20 19
2013-01-02 MX 14 16
一般情况下,我正在寻找一种使用单列唯一值转换表的方法。
我查看了pivot
和groupby
,但没有得到确切的表格。
提示:这可能由pivot
解决,但我还没有能够获得表格
答案 0 :(得分:9)
可能不是最优雅的方式,但使用unstack:
>>> df
date Country Type Val
0 2013-01-01 USA x 23
1 2013-01-01 USA y 13
2 2013-01-01 MX x 11
3 2013-01-01 MX y 14
4 2013-01-02 USA x 20
5 2013-01-02 USA y 19
6 2013-01-02 MX x 14
7 2013-01-02 MX y 16
>>> df.set_index(['date', 'Country', 'Type']).unstack('Type').reset_index()
date Country Val
Type x y
0 2013-01-01 MX 11 14
1 2013-01-01 USA 23 13
2 2013-01-02 MX 14 16
3 2013-01-02 USA 20 19
更一般地说,删除结果中的奇怪分层列:
>>> cols = [c for c in df.columns if c not in {'Type', 'Val'}]
>>> df2 = df.set_index(cols + ['Type']).unstack('Type')
>>> df2
Val
Type x y
date Country
2013-01-01 MX 11 14
USA 23 13
2013-01-02 MX 14 16
USA 20 19
>>> df2.columns = df2.columns.levels[1]
>>> df2.columns.name = None
>>> df2
x y
date Country
2013-01-01 MX 11 14
USA 23 13
2013-01-02 MX 14 16
USA 20 19
>>> df2.reset_index()
date Country x y
0 2013-01-01 MX 11 14
1 2013-01-01 USA 23 13
2 2013-01-02 MX 14 16
3 2013-01-02 USA 20 19
答案 1 :(得分:4)
在找到Dougal的答案之前,我已经根据同样的问题制定了自己的基于枢轴的解决方案,以为我会发布它给后人,因为我发现它更具可读性:
>>> pd.__version__
'0.15.0'
>>> df
date Country Type Val
0 2013-01-01 USA x 23
1 2013-01-01 USA y 13
2 2013-01-01 MX x 11
3 2013-01-01 MX y 14
4 2013-01-02 USA x 20
5 2013-01-02 USA y 19
6 2013-01-02 MX x 14
7 2013-01-02 MX y 16
>>> pt=df.pivot_table(values='Val',
... columns='Type',
... index=['date','Country'],
... )
>>> pt
Type x y
date Country
2013-01-01 MX 11 14
USA 23 13
2013-01-02 MX 14 16
USA 20 19
然后继续进行Dougal的清理:
>>> pt.columns.name=None
>>> pt.reset_index()
date Country x y
0 2013-01-01 MX 11 14
1 2013-01-01 USA 23 13
2 2013-01-02 MX 14 16
3 2013-01-02 USA 20 19
请注意DataFrame.to_csv()
会产生您要求的输出:
>>> print(pt.to_csv())
date,Country,x,y
2013-01-01,MX,11,14
2013-01-01,USA,23,13
2013-01-02,MX,14,16
2013-01-02,USA,20,19
答案 2 :(得分:4)
让我们将原始数据框存储在df
中
然后至少在版本0.18.1
中你可以这样做:
df.pivot_table(values="Val", index=['date', 'Country'], columns='Type')
给出了正确答案:
Type x y
date Country
2013-01-01 MX 11 14
USA 23 13
2013-01-02 MX 14 16
USA 20 19