236 votes

Comment créer un dictionnaire de deux colonnes de DataFrame de Pandas ?

Quelle est la manière la plus efficace d'organiser le Dataframe pandas suivant :

données =

Position    Letter
1           a
2           b
3           c
4           d
5           e

dans un dictionnaire comme alphabet[1 : 'a', 2 : 'b', 3 : 'c', 4 : 'd', 5 : 'e'] ?

321voto

Jeff Points 27612
In [9]: pd.Series(df.Letter.values,index=df.Position).to_dict()
Out[9]: {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

Comparaison des vitesses (selon la méthode de Wouter)

In [6]: df = pd.DataFrame(randint(0,10,10000).reshape(5000,2),columns=list('AB'))

In [7]: %timeit dict(zip(df.A,df.B))
1000 loops, best of 3: 1.27 ms per loop

In [8]: %timeit pd.Series(df.A.values,index=df.B).to_dict()
1000 loops, best of 3: 987 us per loop

132voto

Kikohs Points 1384

J'ai trouvé un moyen plus rapide de résoudre le problème, du moins sur des ensembles de données de taille réaliste : df.set_index(KEY).to_dict()[VALUE]

Preuve sur 50 000 rangs :

df = pd.DataFrame(np.random.randint(32, 120, 100000).reshape(50000,2),columns=list('AB'))
df['A'] = df['A'].apply(chr)

%timeit dict(zip(df.A,df.B))
%timeit pd.Series(df.A.values,index=df.B).to_dict()
%timeit df.set_index('A').to_dict()['B']

Sortie :

100 loops, best of 3: 7.04 ms per loop  # WouterOvermeire
100 loops, best of 3: 9.83 ms per loop  # Jeff
100 loops, best of 3: 4.28 ms per loop  # Kikohs (me)

12voto

Ayeni Lawrence Points 361
dict (zip(data['position'], data['letter']))

cela vous donnera :

{1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

11voto

pakobill Points 196

En Python 3.6, la méthode la plus rapide est toujours celle de WouterOvermeire. La proposition de Kikohs est plus lente que les deux autres options.

import timeit

setup = '''
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(32, 120, 100000).reshape(50000,2),columns=list('AB'))
df['A'] = df['A'].apply(chr)
'''

timeit.Timer('dict(zip(df.A,df.B))', setup=setup).repeat(7,500)
timeit.Timer('pd.Series(df.A.values,index=df.B).to_dict()', setup=setup).repeat(7,500)
timeit.Timer('df.set_index("A").to_dict()["B"]', setup=setup).repeat(7,500)

Résultats :

1.1214002349999777 s  # WouterOvermeire
1.1922008498571748 s  # Jeff
1.7034366211428602 s  # Kikohs

6voto

alvas Points 4333

TL;DR

>>> import pandas as pd
>>> df = pd.DataFrame({'Position':[1,2,3,4,5], 'Letter':['a', 'b', 'c', 'd', 'e']})
>>> dict(sorted(df.values.tolist())) # Sort of sorted... 
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
>>> from collections import OrderedDict
>>> OrderedDict(df.values.tolist())
OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)])

Dans Long

Explication de la solution : dict(sorted(df.values.tolist()))

Étant donné :

df = pd.DataFrame({'Position':[1,2,3,4,5], 'Letter':['a', 'b', 'c', 'd', 'e']})

[out] :

 Letter Position
0   a   1
1   b   2
2   c   3
3   d   4
4   e   5

Essayez :

# Get the values out to a 2-D numpy array, 
df.values

[out] :

array([['a', 1],
       ['b', 2],
       ['c', 3],
       ['d', 4],
       ['e', 5]], dtype=object)

Puis, en option :

# Dump it into a list so that you can sort it using `sorted()`
sorted(df.values.tolist()) # Sort by key

Ou :

# Sort by value:
from operator import itemgetter
sorted(df.values.tolist(), key=itemgetter(1))

[out] :

[['a', 1], ['b', 2], ['c', 3], ['d', 4], ['e', 5]]

Enfin, on transforme la liste de 2 éléments en un dict.

dict(sorted(df.values.tolist())) 

[out] :

{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

Related

Réponse au commentaire de @sbradbio :

S'il existe plusieurs valeurs pour une clé spécifique et que vous souhaitez toutes les conserver, ce n'est pas la méthode la plus efficace mais la plus intuitive :

from collections import defaultdict
import pandas as pd

multivalue_dict = defaultdict(list)

df = pd.DataFrame({'Position':[1,2,4,4,4], 'Letter':['a', 'b', 'd', 'e', 'f']})

for idx,row in df.iterrows():
    multivalue_dict[row['Position']].append(row['Letter'])

[out] :

>>> print(multivalue_dict)
defaultdict(list, {1: ['a'], 2: ['b'], 4: ['d', 'e', 'f']})

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X