Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python DataFrame:使用列的唯一值转换帧_Python_Csv_Pandas - Fatal编程技术网

Python DataFrame:使用列的唯一值转换帧

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

我有一个熊猫数据框/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        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