33033
dataframeのデータを辞書型に格納したいのですが、良い方法を教えてください。  
画像のようなdataframeから下記のような辞書データを作りたいです。  
movie_dict = {  
'UserId(1)':{  
'MovieId(68646)': 10,  
'MovieId(113277)': 10},  
'UserId(2)':{...

[![画像の説明をここに入力](https://i.stack.imgur.com/doqwE.jpg)](https://i.stack.imgur.com/doqwE.jpg)
CC BY-SA 3.0
2017-03-02T02:28:20.890
33032
2017-03-02T16:10:21.803
2017-03-02T04:58:18.443
14418
20893
question
python pandas
dataframeから辞書型への変換について
とりあえず1ライナーで書いてみました。

```

    {'UserId({})'.format(data[0]):{'MovieId({})'.format(record['MovieId']):record['Rating'] for record in data[1].to_dict('records')} for data in df.groupby('UserId')}
    
```

方針としては`groupby`でユーザごとのデータフレームにわけて、そのデータフレームのレコードごとに処理します。ループを明示的に書くと

```

    movie_dict = {}
    for data in df.groupby('UserId'):
        user_key = 'UserId({})'.format(data[0])
        movie_dict[user_key] = {}
        for record in data[1].to_dict('records'):
            movie_dict[user_key]['MovieId({})'.format(record['MovieId'])] = record['Rating']
    
```
CC BY-SA 3.0
2017-03-02T03:27:59.010
33033
2017-03-02T05:41:05.783
2017-03-02T05:41:05.783
14418
14418
33032
answer
既に解決済みですが、`UserId` と `MovieId` の組み合わせをキーにする方法もあるかと思います。具体的には、

```

    dataframe.set_index(['UserId', 'MovieId'])
    
```

とします。

```

    #!/usr/bin/python3
    
    import pandas as pd
    import pprint
    
    df = pd.DataFrame(
      [
        [1, 68646, 10],
        [1, 113277, 10],
        [2, 454876, 8],
        [2, 790636, 7],
        [3, 1300854, 7],
      ],
      columns = ['UserId', 'MovieId', 'Rating'])
    
    movie_dict = {}
    for (u, m), r in df.set_index(['UserId', 'MovieId']).to_dict()['Rating'].items():
      movie_dict.setdefault('UserId('+str(u)+')', {}).update({'MovieId('+str(m)+')': r})
    
    pprint.pprint(movie_dict)
    ## =>
    ## {'UserId(1)': {'MovieId(113277)': 10, 'MovieId(68646)': 10},
    ##  'UserId(2)': {'MovieId(454876)': 8, 'MovieId(790636)': 7},
    ##  'UserId(3)': {'MovieId(1300854)': 7}})
    
```
CC BY-SA 3.0
2017-03-02T11:14:30.003
33040
2017-03-02T16:10:21.803
2017-03-02T16:10:21.803
33032
answer