J'ai une structure de données à deux colonnes et j'ai l'intention de la convertir en dictionnaire python: la première colonne sera la clé et la seconde, la valeur. Merci d'avance.
Trame de données:
id value
0 0 10.2
1 1 5.7
2 2 7.4
Voir la documentation pour to_dict
. Vous pouvez l'utiliser comme ceci:
_df.set_index('id').to_dict()
_
Et si vous n'avez qu'une colonne, pour éviter que le nom de la colonne soit aussi un niveau dans le dict (en fait, dans ce cas, vous utilisez la Series.to_dict()
):
_df.set_index('id')['value'].to_dict()
_
mydict = dict(Zip(df.id, df.value))
Si vous voulez un moyen simple de conserver les doublons, vous pouvez utiliser 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]}
Les réponses de joris dans ce fil et de punchagan dans le fil dupliqué sont très élégantes, mais elles ne donneront pas de résultats corrects si la colonne utilisée pour les clés contient une valeur dupliquée.
Par exemple:
>>> 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}
Si vous avez des entrées dupliquées et que vous ne voulez pas les perdre, vous pouvez utiliser ce code laid mais fonctionnel:
>>> 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]}
Vous pouvez utiliser 'dict comprehension'
my_dict = {row[0]: row[1] for row in df.values}
dans certaines versions, le code ci-dessous peut ne pas fonctionner
mydict = dict(Zip(df.id, df.value))
alors explicite
id_=df.id.values
value=df.value.values
mydict=dict(Zip(id_,value))
Note J'ai utilisé id_ parce que l'identifiant Word est réservé Word
Une autre solution (légèrement plus courte) pour ne pas perdre les entrées en double:
>>> 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]}
Vous avez besoin d'une liste en tant que valeur de dictionnaire. Ce code fera l'affaire.
from collections import defaultdict
mydict = defaultdict(list)
for k, v in Zip(df.id.values,df.value.values):
mydict[k].append(v)
Solution la plus simple:
df.set_index('id').T.to_dict('records')
Exemple:
df= pd.DataFrame([['a',1],['a',2],['b',3]], columns=['id','value'])
df.set_index('id').T.to_dict('records')
Si vous avez plusieurs valeurs, comme val1, val2, val3, etc. et que vous les voulez sous forme de listes, utilisez le code ci-dessous:
df.set_index('id').T.to_dict('list')