【问题标题】:create nested dictionary or collection counter with pandas and python使用 pandas 和 python 创建嵌套字典或集合计数器
【发布时间】:2018-04-23 16:13:55
【问题描述】:

我想通过分组在python中创建一个嵌套字典或集合

seriesA = ["groupA", "groupA", "groupB", "groupB", "groupC"]
seriesB = ["item1", "item1," "item3", "item1", "item2"]

期望的输出:

{ 'groupA': {'item1': 2},
  'groupB': {'item3': 1}, {'item1':1},
  'groupC': {'item2': 1}}

在 Python 中,是否有更简单的方法,或者我会遍历列出的元组并添加一个集合计数器?

nested_dict["groupA"]["item1"] 

...应该返回 2 次。

【问题讨论】:

  • 那是一个无效的字典
  • 您不想在所需的输出中添加'groupB': {'item3': 1, 'item1':1}, 吗?
  • 它会叫什么?具有嵌套键值对或计数器的字典

标签: python pandas dictionary counter


【解决方案1】:

我会使用collections.defaultdictcollections.Counter

from collections import defaultdict, Counter
from pprint import pprint

seriesA = ["groupA", "groupA", "groupB", "groupB", "groupC"]
seriesB = ["item1", "item1", "item3", "item1", "item2"]

nested_dict = defaultdict(Counter)

for a,b in zip(seriesA, seriesB):
    nested_dict[a][b] += 1

assert nested_dict["groupA"]["item1"] == 2

【讨论】:

    【解决方案2】:

    我觉得格式应该是{key:[{ke1:va1,key2:val2}]}

    pd.DataFrame([seriesA,seresB]).T.groupby([0,1]).size().groupby(level=0).apply(lambda x : [x.reset_index(level=0,drop=True).to_dict()]).to_dict()
    Out[362]: 
    {'groupA': [{'item1': 2}],
     'groupB': [{'item1': 1, 'item3': 1}],
     'groupC': [{'item2': 1}]}
    

    【讨论】:

      【解决方案3】:

      指定的所需输出不是有效的字典。但是,您可以使用itertools.groupbycollections.Counter 获得类似的有效结果:

      seriesA = ["groupA", "groupA", "groupB", "groupB", "groupC"]
      seriesB = ["item1", "item1", "item3", "item1", "item2"]
      
      from itertools import groupby
      from collections import Counter
      
      myCounts = {k: Counter(map(lambda g: g[1], group)) 
       for k, group in groupby(sorted(zip(seriesA, seriesB)), key=lambda x: x[0])}
      
      print(myCounts)
      #{'groupA': Counter({'item1': 2}),
      # 'groupB': Counter({'item1': 1, 'item3': 1}),
      # 'groupC': Counter({'item2': 1})}
      

      如果您不想在字典中包含 Counters,您可以使用以下方法进行转换:

      print({k: dict(v) for k, v in myCounts.items()})
      #{'groupA': {'item1': 2},
      # 'groupB': {'item1': 1, 'item3': 1},
      # 'groupC': {'item2': 1}}
      

      【讨论】:

      • 也许是groupby(sorted(zip(...)), key=...)。这样,无论seriesA 的顺序如何,代码都能正常工作。
      猜你喜欢
      • 2021-08-25
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 2022-06-13
      • 2021-11-29
      • 2021-04-04
      • 2019-07-26
      • 2015-02-18
      相关资源
      最近更新 更多