web-dev-qa-db-fra.com

python pandas dataframe to dictionary

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
78
perigee

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()
_
118
joris
mydict = dict(Zip(df.id, df.value))
49
praful gupta

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]}
42
DSM

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]}
21
dalloliogm

Vous pouvez utiliser 'dict comprehension'

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

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

5
Vincent Appiah

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]}
3
user1376377

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)
1
Dmitry

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')
0
Gil Baggio