【问题标题】:Python counting occurrence of values in dictionaryPython计算字典中值的出现
【发布时间】:2018-10-23 22:03:25
【问题描述】:

我正在尝试计算字典中国家/地区的出现次数。 我正在使用 CSV 文件中的 for 循环读取所有国家/地区。并将它们添加到列表中:

landen = []
landen.append({"Datum": datumbestand, "Land": [land]})

然后我尝试按日期合并所有国家/地区:

scores_unique = {}
for item in landen:
    if item['Datum'] not in scores_unique:
        scores_unique.update({item['Datum']: item['Land']})
    else:
        scores_unique[item['Datum']] += item['Land']

当我打印我的输出时,我得到以下信息(我数据的一小部分):

[('2017-11-20', [US', 'US', 'US', 'US', 'SK', 'SK', 'IE', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'ES', 'ES', 'DE', 'CA', 'CA', 'CA', 'CA', 'CA', 'CA', 'CA', 'CA', 'CA', 'CA', 
('2017-11-10', ['US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US',

现在我想从每个日期查看最常出现的国家/地区。比如:

2017-11-20:
USA 10x
SK 3x
IE 2x

2017-11-10
USA 20x
GB 15x

并查看每个日期的出现差异。但是我尝试了很长时间,但我无法计算出现次数并打印出来。

【问题讨论】:

  • 你能提供一个完整的例子来简化测试吗?

标签: python list dictionary


【解决方案1】:

您无需在列表中保留相同项目的重复副本。使用collections.Counter 对象来保持从您的 CSV 阅读器/文件中直接读取的每个对象的计数,在collections.defaultdict 中的相应日期键入每个计数器:

from collections import Counter, defaultdict

d = defaultdict(Counter)

for date, country in csv_reader:
    d[date][country] += 1

然后您可以使用Counter 对象的most_common 方法来获取每个日期出现次数最多的国家/地区:

for date, counter in d.items():
    print(date, counter.most_common(3))

【讨论】:

    【解决方案2】:

    您可以从列表中创建字典并使用count() 函数来执行此操作。

    这将大致按以下方式工作:

    result_occurrences = {i:scores_unique.count(i) for i in scores_unique}
    print result_occurrences
    

    这适用于 Python 2.7。对于 Python 3,您可以编写:

    result_occurrences = {i:list(scores_unique.values()).count(i) for i in scores_unique}
    print(result_occurrences)
    

    另一种方法是使用Collections.Counter

    【讨论】:

      【解决方案3】:

      这是一个基于 pandas 应用 valuecounts 的解决方案,即

      import pandas as pd    
      tup= [('2017-11-20', ['US', 'US', 'US', 'US', 'SK', 'SK', 'IE', 'GB', 
       'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 
       'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB', 'GB',
       'GB', 'GB', 'GB', 'ES', 'ES', 'DE', 'CA', 'CA', 'CA', 'CA', 'CA', 
       'CA', 'CA', 'CA', 'CA', 'CA']), 
       ('2017-11-10', ['US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 
      'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 
      'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 
      'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 
      'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 'US', 
      'US', 'US', 'US', 'US'])]
      
      count = pd.DataFrame(tup).set_index(0)[1].apply(pd.Series.value_counts).stack()
      
      2017-11-20 CA 10.0 德 1.0 ES 2.0 国标 28.0 IE 1.0 SK 2.0 美国 4.0 2017-11-10 美国 61.0 数据类型:float64
      count.to_dict()
      
      {('2017-11-20', 'ES'): 2.0, ('2017-11-20', 'US'): 4.0, ('2017-11-20', 'CA'): 10.0, ('2017-11-20', 'GB'): 28.0, ('2017-11-20', 'SK'): 2.0, ('2017-11-20', 'IE'): 1.0, ('2017-11-10', 'US'): 61.0, ('2017-11-20', 'DE'): 1.0}
      

      【讨论】:

        猜你喜欢
        • 2018-06-30
        • 2021-12-04
        • 2019-07-13
        • 1970-01-01
        • 2021-12-24
        • 1970-01-01
        • 2021-11-25
        • 2015-09-06
        • 1970-01-01
        相关资源
        最近更新 更多