2017-10-30 12 views
3

私はstackoverflowの1つのキーを持つデータフレームを複数のリスト値にする方法は、Pythonで辞書に?

df.set_index('ID').T.to_dict('list') 

で他の記事からそれらを変換するためのコードを試してみました。しかし、それは私に一つだけのリスト値

と各IDとリターンを与えるこの

ID A B  
1  3 5 
1  4 2 
1  0 4 
2  2 1 
2  4 5 
2  9 3 
3  2 1 
3  4 6 

のようなデータフレームを持っています

{'1': [3,5], '2': [2,1], '3': [2,1]} 

このようなdictを作ることは可能ですか?

{'1': ([3,5],[4,2],[0,4]), '2': ([2,1],[4,5],[9,3]), '3': ([2,1],[4,6])} 

辞書キーはIDを返します。すべてのIDはタプルのリストと結合し、すべてのタプルには2つの値が含まれます。

答えて

4
In [150]: df.groupby('ID')['A','B'].apply(lambda x: x.values.tolist()).to_dict() 
Out[150]: 
{'1': [[3, 5], [4, 2], [0, 4]], 
'2': [[2, 1], [4, 5], [9, 3]], 
'3': [[2, 1], [4, 6]]} 
3

defaultdict
これは良いアプローチです。ループはforで、importが必要で、複数の行(upvotesを阻むすべてのもの)がある可能性があります。しかし、それは実際には良い解決策であり、非常に高速です。

from collections import defaultdict 

d = defaultdict(list) 

for i, a, b in df.values.tolist(): 
    d[i].append([a, b]) 

dict(d) 

{1: [[3, 5], [4, 2], [0, 4]], 2: [[2, 1], [4, 5], [9, 3]], 3: [[2, 1], [4, 6]]} 

代替
ところでnumpy.ndarray
と創造TADの取得:実際にこの

pd.Series(
    df[['A', 'B']].values[:, None].tolist(), 
    df.ID.values 
).sum(level=0).to_dict() 

{1: [[3, 5], [4, 2], [0, 4]], 2: [[2, 1], [4, 5], [9, 3]], 3: [[2, 1], [4, 6]]} 

をしないでください
関連する問題