5

フォームの pandas dataframe/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

一般に、単一の列の一意の値を使用してテーブルを変換する方法を探しています。

pivotandを見ましgroupbyたが、正確なフォームが得られませんでした。

ヒント: おそらくこれで解決pivotできますが、フォームを取得できませんでした

4

3 に答える 3

10

おそらく可能な限り最もエレガントな方法ではありませんが、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
于 2013-06-27T02:46:45.840 に答える
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
于 2015-01-28T22:03:45.207 に答える
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
于 2016-10-01T15:35:13.343 に答える