Python DataFrame:使用列的唯一值转换帧
我有一个熊猫数据框/csv的形式Python DataFrame:使用列的唯一值转换帧,python,csv,pandas,Python,Csv,Pandas,我有一个熊猫数据框/csv的形式 date 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
date 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
解决的,但是我还没有得到表单可能不是最优雅的方式,但是使用:
更一般地说,删除结果中奇怪的层次结构列:
>>> 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
在找到Dougal的答案之前,我为同一个问题制定了自己的基于pivot的解决方案,我想我会把它发布给后代,因为我发现它更具可读性:
>>> 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
让我们将原始数据帧存储在
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
哇!谢谢你的快速回复。。我猜是心理障碍,但有没有办法删除索引名如果你是说
类型
,它实际上不是df.index.name
,而是df.columns
是分层的,并且具有名称类型
。我编辑了《如何摆脱它》谢谢你把它弄明白了。。。忘记编辑了。。但它似乎足够有效。。接受答案:)谢谢你的替代解决方案!
Type x y
date Country
2013-01-01 MX 11 14
USA 23 13
2013-01-02 MX 14 16
USA 20 19