从python中的字典系列中选择不同的键及其计数

时间:2017-06-05 08:40:04

标签: python pandas dictionary series

我有一个pandas字典系列,它采用像

这样的值
   0 {AA:25,BB:31}
   1 {CC:45,AA:3}
   2 {BB:3,CD:4,AA:5}

我想根据键及其在系列中的出现来创建一个字典,如:

{AA:3,BB:2,CC:1,CD:1}

4 个答案:

答案 0 :(得分:3)

我怀疑是否有#34;内置"解决此问题的方法,因此您必须手动迭代并计算每个字典中的每个键。

import pandas as pd
from collections import defaultdict

ser = pd.Series([{'AA':25,'BB':31},
                 {'CC':45,'AA':3},
                 {'BB':3,'CD':4,'AA':5}])

count = defaultdict(int)

for d in ser:
    for key in d:
        count[key] += 1

print(count)
# defaultdict(<class 'int'>, {'CC': 1, 'BB': 2, 'AA': 3, 'CD': 1})

您也可以使用Counter,但这看起来相当&#34;强迫&#34;在这种情况下:

import pandas as pd
from collections import Counter

total = Counter()

ser = pd.Series([{'AA':25,'BB':31},
                 {'CC':45,'AA':3},
                 {'BB':3,'CD':4,'AA':5}])

for d in ser:
    total.update(d.keys())

print(total)
# Counter({'AA': 3, 'BB': 2, 'CD': 1, 'CC': 1})

答案 1 :(得分:3)

将您的系列转换为一系列密钥列表,对那些创建单个密钥列表的密钥进行求和,然后使用Counter

In [23]: pd.Series([{'AA':25,'BB':31},{'CC':45,'AA':3},{'BB':3,'CD':4,'AA':5}])
Out[23]: 
0           {'AA': 25, 'BB': 31}
1            {'AA': 3, 'CC': 45}
2    {'CD': 4, 'AA': 5, 'BB': 3}
dtype: object

In [24]: series = _

In [34]: from collections import Counter

In [35]: Counter(series.apply(lambda x: list(x.keys())).sum())
Out[35]: Counter({'AA': 3, 'BB': 2, 'CC': 1, 'CD': 1})

或使用生成器表达式和展平:

In [37]: Counter(k for d in series for k in d.keys())
Out[37]: Counter({'AA': 3, 'BB': 2, 'CC': 1, 'CD': 1})

答案 2 :(得分:0)

counter = dict()
for item in series:
    for key in item:
       counter[key] = counter.get(key, 0) + 1

答案 3 :(得分:0)

也许它有点晚了,但这是通过使用pandas内置函数实现它的另一种方式。

s = pd.Series([{'AA':25,'BB':31},
                 {'CC':45,'AA':3},
                 {'BB':3,'CD':4,'AA':5}])


#convert dict to a dataframe and count non nan elements and finally convert it to a dict.    
s.apply(pd.Series).count().to_dict()
Out[651]: {'AA': 3, 'BB': 2, 'CC': 1, 'CD': 1}