web-dev-qa-db-ja.com

python pandasデータフレームから辞書へ

2列のデータフレームがあり、python辞書に変換する予定です-最初の列がキーになり、2番目の列が値になります。前もって感謝します。

データフレーム:

    id    value
0    0     10.2
1    1      5.7
2    2      7.4
78
perigee

to_dict のドキュメントを参照してください。次のように使用できます。

df.set_index('id').to_dict()

また、列が1つしかない場合、列名を避けるためにディクショナリのレベルでもあります(実際、この場合はSeries.to_dict()を使用します)。

df.set_index('id')['value'].to_dict()
118
joris
mydict = dict(Zip(df.id, df.value))
49
praful gupta

重複を保持する簡単な方法が必要な場合は、groupbyを使用できます。

>>> ptest = pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value']) 
>>> ptest
  id  value
0  a      1
1  a      2
2  b      3
>>> {k: g["value"].tolist() for k,g in ptest.groupby("id")}
{'a': [1, 2], 'b': [3]}
42
DSM

このスレッドのjorisと duplicated thread のpunchaganによる回答は非常にエレガントですが、キーに使用される列に重複する値が含まれている場合、正しい結果が得られません。

例えば:

>>> ptest = p.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value']) 
>>> ptest
  id  value
0  a      1
1  a      2
2  b      3

# note that in both cases the association a->1 is lost:
>>> ptest.set_index('id')['value'].to_dict()
{'a': 2, 'b': 3}
>>> dict(Zip(ptest.id, ptest.value))
{'a': 2, 'b': 3}

重複したエントリがあり、それらを失いたくない場合、このugいが動作するコードを使用できます。

>>> mydict = {}
>>> for x in range(len(ptest)):
...     currentid = ptest.iloc[x,0]
...     currentvalue = ptest.iloc[x,1]
...     mydict.setdefault(currentid, [])
...     mydict[currentid].append(currentvalue)
>>> mydict
{'a': [1, 2], 'b': [3]}
21
dalloliogm

「dict内包表記」を使用できます

my_dict = {row[0]: row[1] for row in df.values}
6
Dongwan Kim

一部のバージョンでは、以下のコードが機能しない場合があります

mydict = dict(Zip(df.id, df.value))

明示的にする

id_=df.id.values
value=df.value.values
mydict=dict(Zip(id_,value))

私はid_を使用しました

5
Vincent Appiah

重複エントリを失わないための別の(少し短い)ソリューション:

>>> ptest = pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id','value'])
>>> ptest
  id  value
0  a      1
1  a      2
2  b      3

>>> pdict = dict()
>>> for i in ptest['id'].unique().tolist():
...     ptest_slice = ptest[ptest['id'] == i]
...     pdict[i] = ptest_slice['value'].tolist()
...

>>> pdict
{'b': [3], 'a': [1, 2]}
3
user1376377

辞書値としてリストが必要です。このコードはトリックを行います。

from collections import defaultdict
mydict = defaultdict(list)
for k, v in Zip(df.id.values,df.value.values):
    mydict[k].append(v)
1
Dmitry

最も簡単なソリューション:

df.set_index('id').T.to_dict('records')

例:

df= pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id','value'])
df.set_index('id').T.to_dict('records')

Val1、val2、val3などの複数の値があり、uをリストとして使用する場合は、次のコードを使用します。

df.set_index('id').T.to_dict('list')
0
Gil Baggio