【问题标题】:Selecting distinct keys and their counts from a dictionary series in python从python中的字典系列中选择不同的键及其计数
【发布时间】:2017-11-05 23:49:00
【问题描述】:

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

这样的值
   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}

【问题讨论】:

  • 那个“字典系列”到底是什么?熊猫系列对象?
  • 是的,更新了问题。

标签: python pandas dictionary series


【解决方案1】:

也许有点晚了,但这是使用 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}

【讨论】:

    【解决方案2】:

    将您的系列转换为一系列键列表,将创建单个键列表的那些相加,并使用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})
    

    【讨论】:

      【解决方案3】:

      我怀疑是否存在“内置”解决方案,因此您必须手动迭代并计算每个字典中的每个键。

      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,但是在这种情况下这看起来相当“强制”:

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

      【讨论】:

      • 我正在使用Counter 编写解决方案。我会删除我的。 +1
      【解决方案4】:
      counter = dict()
      for item in series:
          for key in item:
             counter[key] = counter.get(key, 0) + 1
      

      【讨论】:

      • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
      猜你喜欢
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 2019-08-25
      • 2021-06-07
      • 1970-01-01
      • 2021-05-25
      相关资源
      最近更新 更多