2012-06-17 18 views
12

डाटा फ्रेम:बदलें डेटा फ्रेम dict को

pair = collections.defaultdict(collections.Counter) 

उदा

pair = {'doc1': {'word1':4, 'word2':3}, 
     'doc2': {'word1':2, 'word3':4}, 
     'doc3': {'word2':2, 'word4':1}, 
     ...} 

मैं डेटा फ्रेम रखते हैं लेकिन इस हिस्से {'word1':4, 'word2':3}{'word1':2, 'word3':4}``... अब यह एक Counter है के प्रकार में परिवर्तन करना चाहते हैं और मैं एक dict की जरूरत है।

मैं इस कोशिश की pair से डेटा प्राप्त करने के लिए, लेकिन मैं नहीं जानता कि प्रत्येक दस्तावेज़ के लिए एक dict बनाने का तरीका:

new_pair = collections.defaultdict(collections.Counter) 
for doc, tab in testing.form.items(): 
    for word, freq in tab.items(): 
     new_pair[doc][word] = freq 

मैं उत्पादन को बदलने के लिए नहीं करना चाहती। मुझे बस प्रत्येक दस्तावेज़ में की आवश्यकता है, डेटा प्रकार dict है, Counter नहीं।

+1

वास्तविक ट्रेसबैक और अधिक संदर्भ पोस्ट करें। – agf

+0

डब्ल्यूएचओ कहता है 'पहला तर्क कॉल करने योग्य होना चाहिए'? – joaquin

+0

आप क्या चाहते हैं? क्या आप वह आउटपुट दे सकते हैं जो आप चाहते हैं? – shihongzhi

उत्तर

20

Counter पहले से ही dict - या, इसका उप-वर्ग है। लेकिन, क्या तुम सच में, तो इसकी एक एक लाइनर किसी कारण के लिए एक dict वास्तव में जरूरत है:

>>> c = Counter(word1=4, word2=3) 
>>> c 
Counter({'word1': 4, 'word2': 3}) 
>>> dict(c) 
{'word1': 4, 'word2': 3} 

किसी भी मानचित्रण (कुछ भी है कि एक शब्दकोश की तरह बर्ताव) dict में पारित किया जा सकता है, और आप एक dict साथ मिल जाएगा वही सामग्री इसे स्वयं बनाने के लिए इसे फिर से शुरू करने की आवश्यकता नहीं है।

यह आपको एक लूप देता है, जिसमें नेस्टेड लूप की बजाय शरीर में एक पंक्ति होती है। लेकिन फार्म के किसी भी कोड:

thing = a new empty collection 
for elem in old_thing: 
    Add something to do with elem to thing 

आम तौर पर एक जनरेटर अभिव्यक्ति या एक सूची का उपयोग कर एक लाइन में किया जा सकता है, सेट या dict समझ। हम dict बना रहे हैं, इसलिए dict comprehension (उदाहरण अनुभाग वह है जो आप सबसे अधिक रुचि रखते हैं) ऐसा लगता है। मैं पाठक के लिए एक अभ्यास के रूप में इसके साथ आने के लिए छोड़ देंगे। ;-)

+1

+1 चूंकि 'काउंटर' की कार्यक्षमता की आवश्यकता है, इसलिए इसे केवल' dict' में परिवर्तित किया जा सकता है, इसलिए यह करने का यही एकमात्र तरीका है। – jamylak

+1

@jamylak kk। धन्यवाद। – juju

0

हो सकता है कि आप देख रहे हैं:

>>> from collections import defaultdict 
>>> pair = defaultdict(dict) 
>>> pair[3][2]='hello' 
>>> 
>>> pair 
defaultdict(<type 'dict'>, {3: {2: 'hello'}}) 
>>> 
>>> pair[3] 
{2: 'hello'} 
>>> 
+0

'dd (lambda: dict()) के बजाय' dd (dict) 'काम नहीं करेगा? – DSM

+0

@DSM, हाँ, जाहिर है, मेरी गलती। – joaquin

0
new_pair = {} # simple dict at the top level 
for doc, tab in testing.form.items(): 
    for word, freq in tab.items(): 
     # top-level values is word counters 
     new_pair[doc].setdefault(word, Counter()) += freq 
0

Counter भी एक dict है। लेकिन आप की जरूरत पर निर्भर करता है, हो सकता है कि फॉलो कोड आप चाहते हैं।

new_pair ={} 
for doc, tab in pari.items(): 
    new_pair[doc] = {} 
    for word, freq in tab.items(): 
     new_pair[doc][word] = freq 

new_pair dict आप चाहते हैं। शुभ लाभ!

संबंधित मुद्दे