54

数据框:

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}``...它现在是 aCounter我需要一个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

4

5 回答 5

85

ACounter已经是一个dict- 或者它的一个子类。但是,如果您出于某种原因确实需要一个dict,那么它是一个单行:

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

任何映射(任何表现得像字典的东西)都可以传递给dict,您将获得dict具有相同内容的 a 。无需迭代它来自己构建它。

这为您提供了一个循环,主体中有一行而不是嵌套循环。但任何形式的代码:

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

通常可以使用生成器表达式或列表、集合或字典理解在一行中完成。我们正在构建一个dict,所以一个dict 理解(示例部分是您最感兴趣的部分)似乎很可能。我将把它作为练习留给读者。;-)

于 2012-06-17T05:00:18.447 回答
0

也许您正在寻找:

>>> from collections import defaultdict
>>> pair = defaultdict(dict)
>>> pair[3][2]='hello'
>>>
>>> pair
defaultdict(<type 'dict'>, {3: {2: 'hello'}})
>>>
>>> pair[3]
{2: 'hello'}
>>> 
于 2012-06-17T05:00:29.343 回答
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
于 2012-06-17T05:10:45.227 回答
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_pairdict是你想要的。祝你好运!

于 2012-06-17T05:15:55.443 回答
0

由于 Counter 已经是一个字典。
除了@lvc answer之外,我还想提出这个建议。

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

这允许您添加更多键并组合多个字典或计数器

>>> {**c, 'total': sum(c.values())}
{'word1': 4, 'word2': 3, 'total': 7}
于 2021-12-28T05:28:34.900 回答