我正在尝试计算字典中国家/地区的出现次数。 我正在从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
从每个日期看出发生的差异。但是我一直在尝试很长时间,但我无法计算出现并打印出来。
答案 0 :(得分:2)
您不需要在列表中保留相同项目的重复副本。使用collections.Counter
对象直接从CSV阅读器/文件中读取每个对象的计数,并在collections.defaultdict
中键入相应日期的每个对象:
from collections import Counter, defaultdict
d = defaultdict(Counter)
for date, country in csv_reader:
d[date][country] += 1
然后,您可以使用most_common
对象的Counter
方法获取每个日期出现次数最多的国家/地区:
for date, counter in d.items():
print(date, counter.most_common(3))
答案 1 :(得分: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。
答案 2 :(得分:1)
这是一个基于pandas apply 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 DE 1.0 ES 2.0 GB 28.0 IE 1.0 SK 2.0 US 4.0 2017-11-10 US 61.0 dtype: 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}