2列のデータフレームがあり、python辞書に変換する予定です-最初の列がキーになり、2番目の列が値になります。前もって感謝します。
データフレーム:
id value
0 0 10.2
1 1 5.7
2 2 7.4
to_dict
のドキュメントを参照してください。次のように使用できます。
df.set_index('id').to_dict()
また、列が1つしかない場合、列名を避けるためにディクショナリのレベルでもあります(実際、この場合はSeries.to_dict()
を使用します)。
df.set_index('id')['value'].to_dict()
mydict = dict(Zip(df.id, df.value))
重複を保持する簡単な方法が必要な場合は、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]}
このスレッドの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]}
「dict内包表記」を使用できます
my_dict = {row[0]: row[1] for row in df.values}
一部のバージョンでは、以下のコードが機能しない場合があります
mydict = dict(Zip(df.id, df.value))
明示的にする
id_=df.id.values
value=df.value.values
mydict=dict(Zip(id_,value))
注私はid_を使用しました
重複エントリを失わないための別の(少し短い)ソリューション:
>>> 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]}
辞書値としてリストが必要です。このコードはトリックを行います。
from collections import defaultdict
mydict = defaultdict(list)
for k, v in Zip(df.id.values,df.value.values):
mydict[k].append(v)
最も簡単なソリューション:
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')