दो पांडा डेटाफ्रेम कॉलम का शब्दकोश बनाने के लिए सबसे कुशल तरीका क्या है?


136

निम्नलिखित पांडा डेटाफ़्रेम को व्यवस्थित करने का सबसे कुशल तरीका क्या है:

डेटा =

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

जैसे एक शब्दकोश में alphabet[1 : 'a', 2 : 'b', 3 : 'c', 4 : 'd', 5 : 'e']?

जवाबों:


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

गति तुलना (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

20
पहली सीरीज़ बनाए बिना ... तानाशाही (zip (df.Position, df.Letter))
Wouter Overmeire

1
FYI करें ..... मेरी विधि हुड के बहुत करीब है जैसा कि Wouter क्या कर रहा है, अंतर इसके उपयोग izipके बजाय, लागू किया गया है zip; जेनरेटर से मुझे लगता है कि फर्क पड़ता है
जेफ

1
@ रूटरऑवरमेयर मेरे आवेदन में यह पूरी तरह से काम करता है, आपके योगदान के लिए धन्यवाद
user1083734

3
@ जेफ तानाशाह (जिप ...) सबसे तेज एक
राउटर ओवरमीयर

3
आकृति के साथ एक DataFrame पर = (100,2), ताना के साथ राउटर की विधि (ज़िप ...) जेफ की तुलना में 3x तेज थी - मैंने% timeit का उपयोग किया
Quetzalcoatl

79

मुझे समस्या को हल करने का एक तेज़ तरीका मिला, कम से कम वास्तविक रूप से बड़े डेटासेट का उपयोग करके: df.set_index(KEY).to_dict()[VALUE]

50,000 पंक्तियों पर प्रमाण:

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']

आउटपुट:

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)

18
हमेशा संभव तेज उत्तरों के लिए नीचे स्क्रॉल करें!
नूर वुल्फ

5

पायथन 3.6 में सबसे तेज़ तरीका अभी भी WouterOvermeire है। किकोह का प्रस्ताव अन्य दो विकल्पों की तुलना में धीमा है।

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)

परिणाम:

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

4

टी एल; डॉ

>>> 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)])

लंबे समय में

समझा समाधान: dict(sorted(df.values.tolist()))

दिया हुआ:

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

[बाहर]:

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

प्रयत्न:

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

[बाहर]:

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

फिर वैकल्पिक रूप से:

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

या:

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

[बाहर]:

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

अंत में, 2 तत्वों की सूची की सूची एक तानाशाही में डालें।

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

[बाहर]:

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

सम्बंधित

उत्तर @sbradbio टिप्पणी:

यदि किसी विशिष्ट कुंजी के लिए कई मान हैं और आप उन सभी को रखना चाहते हैं, तो यह सबसे कुशल नहीं बल्कि सबसे सहज तरीका है:

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'])

[बाहर]:

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

क्या कोई ऐसा तरीका है जिससे आप मान के रूप में एक से अधिक कॉलम जोड़ सकते हैं{'key': [value1, value2]}
sbradbio

1
चेक किए गए उत्तर की जाँच करें
alvas

मुझे लगता है कि value1 और value2 दो अलग-अलग कॉलम हैं। क्या आप {'id': ['long', 'lat]} के साथ एक शब्दकोश बना सकते हैं? लंबे और लम्बे अलग-अलग कॉलम में हैं।
किलोमीटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.