pythonのPandasで、縦持ちのデータを横持ちにするよい方法を教えてください。


python初心者です。  
いろいろ調べながら進めているのですが、どうしてもすっきりしないので、どなたか教えていただけませんでしょうか？

◆Pandasのデータフレームで、縦持ちのデータを横持ちに変換する方法です。

以下のような縦持ちのデータがあるとします。（csvから読み込み）

[code]

    　　ID　number　item
    0　　A　　111　　nn
    1　　A　　123　　mm
    2　　A　　211　　op
    3　　B　　121　　nm
    4　　B　　333　　nn
    
[/code]

これを、次のような横持ちデータにしたいです。  
これもデータフレームで出力したいのです。

[code]

    ID　　number　　item　　number　　item　　number　　item
    A　　　111　　　　nn　　　123　　　  mm　　　211　　　  op
    B　　　211　　　　nm　　　333　　　  nn
    
[/code]

For文などで地道に実行することはできたのですが、どうも処理速度を考えるとどうかなという気がします。  
また、拙いので、ここへの掲載を自粛いたします・・・。

よろしくお願いいたします。




`groupby`でグループ化し， `apply`でグループ内の要素を結合する関数`f`を適用します．
`DataFrame`のまま結合するので同じcolumn名は使えないので，ここでは`number`,`number1`,`number2`,...のように末尾に数字を加えるた新たなcolumnにしています(`rsuffix='{0}'.format(i)`のところ).
これで以下のようにDataFrameを作れます．

[code]

    def f(a):    
        a.index = [0 for i in range(len(a))]
        del a['ID']
        out = a[0:1]
        for i in range(1, len(a)):
            out = out.join(a[i:i+1], rsuffix='{0}'.format(i))
        return out
    
    df = pd.DataFrame([['A', 111, 'nn'], ['A', 123, 'mm'], ['A', 211, 'op'],
      ['B', 121, 'nm'], ['B', 333, 'nn']], columns=['ID','number','item'])
    
    df2 = df.groupby(df['ID']).apply(f)
    
[/code]

出力してみると以下のようになっています．

[code]

    >>>> print(df2)
         item item1 item2  number  number1  number2
    ID                                             
    A  0   nn    mm    op     111      123    211.0
    B  0   nm    nn   NaN     121      333      Nan  
    
[/code]

ただこのままではindexがよけいな0がはいってMultiindexになっているのがうっとおしいので以下のようにすれば，0を消してSingleindexにできます．

[code]

    >>>> df3 = pandas.DataFrame(df2.to_records())
    >>>> del df3['level_0']
    >>>> print(df3)
     ID item item1 item2  number  number1  number2
    0  A   nn    mm    op     111      123    211.0
    1  B   nm    nn   NaN     121      333      NaN    
    
[/code]

