70704


データフレームから  
`dic1 = dict(zip(df['pid'], df['nid']))`  
を使って辞書を作りたいのですが、  
pidに重複があるためうまくいきません。（おそらく上書きが起こっています。）  
(pid, nid) = {'8':'11', '8':'19'}  
の際はkeyが重複していればvalueがリストになるように、  
この場合だと{8:[11,19]}  
のようにしたいです。  
(pid, nid) = {'32':'131', '32':'192', '32':'1962'}  
の場合だと{32:[131,192,1962]}  
でしょうか。

**追記**  
例としてデータフレームを作成しました。

[code]

    import pandas as pd
    import numpy as np
    pd.DataFrame({'pid': ['8', '8', '1', '32', '32', '32', '32', '32', '3'],
                  'col_1': np.arange(3, 12),
                  'nid': ('11', '19', '8', '354', '5', '64', '432', '142', '2')})
    
[/code]

**再追記**  
metropolisさんの方法に補足です。  
`df.groupby('pid').nid.apply(lambda x: x.to_list()).to_dict()`  
とすると要素一つのものもリストになるようです。


CC BY-SA 4.0
2020-09-25T14:56:09.120
70699
2020-09-28T15:24:20.487
2020-09-28T15:24:20.487
12457
12457
question
python pandas
データフレームの2列から辞書を作る際、keyが重複しているのでvalueをリスト化する方法


`groupby` でまとめて `apply` で形式を整えます。

[code]

    >>> df.groupby('pid').nid.apply(lambda x: x.iloc[0] if len(x)==1 else x.to_list()).to_dict()
    {'1': '8', '3': '2', '32': ['354', '5', '64', '432', '142'], '8': ['11', '19']}
    
[/code]


CC BY-SA 4.0
2020-09-25T16:46:39.927
70704
2020-09-25T16:46:39.927
70699
answer