私は2列のデータフレームを持っているので、それをpython辞書に変換するつもりです。最初の列がキーになり、2番目の列が値になります。前もって感謝します。
データフレーム:
id value
0 0 10.2
1 1 5.7
2 2 7.4
私は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つしかない場合は、列名がdictのレベルでもないようにします(実際には、この場合はを使用しますSeries.to_dict()
)。
df.set_index('id')['value'].to_dict()
>>> ptest = p.DataFrame([['a',1],['a',2],['b',3]], columns=['id', 'value']) >>> ptest.set_index('id')['value'].to_dict()
重複を保存する簡単な方法が必要な場合は、次を使用できます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と複製されたスレッドのパンチガンによる回答は非常に洗練されていますが、キーに使用される列に重複する値が含まれていると、正しい結果が得られません。
例えば:
>>> 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}
重複したエントリがあり、それらを失いたくない場合は、次の醜いが機能するコードを使用できます。
>>> 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]}
mydict = defaultdict(list)\n for (key, val) in ptest[["id", "value"]].itertuples(index=False):\n mydict[key].append(val)
最も簡単なソリューション:
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などの複数の値があり、それらをリストとして使用する場合は、以下のコードを使用します。
df.set_index('id').T.to_dict('list')
records
ここではどういう意味ですか?
records
ここで@mingchau とは、pandas.pydata.org / pandas‘records’ : list like [{column -> value}, … , {column -> value}]
一部のバージョンでは、以下のコードが機能しない場合があります
mydict = dict(zip(df.id, df.value))
だからそれを明示的にする
id_=df.id.values
value=df.value.values
mydict=dict(zip(id_,value))
idという単語は予約語であるため、id_を使用したことに注意してください
「dict comprehension」を使用できます
my_dict = {row[0]: row[1] for row in df.values}
重複したエントリを失わないための別の(少し短い)解決策:
>>> 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つの列から辞書を作成しようとしたときに、この質問を見つけました。私の場合、データフレームには列A、B、Cがあります(AとBは経度と緯度の地理座標で、Cは国の地域/州などです)。
対応する行のC(ディクショナリ値)の値と一致するA、B値(ディクショナリキー)の各ペアが含まれるディクショナリが必要でした(A、B値の各ペアは、以前のフィルタリングにより一意であることが保証されていますが、このコンテキストでは、AとBの値の異なるペアに対して同じCの値を使用することができるため、次のようにしました。
mydict = dict(zip(zip(df['A'],df['B']), df['C']))
パンダを使う to_dict()も機能します:
mydict = df.set_index(['A','B']).to_dict(orient='dict')['C']
(ディクショナリを作成する行を実行する前に、列AもBもインデックスとして使用されていませんでした)
どちらのアプローチも高速です(85k行のデータフレーム、5年前の高速デュアルコアラップトップでは1秒未満)。
私がこれを投稿している理由: