2017-01-22 112 views
0

我有一个较大的DictionaryID(10,000+条目)的ReviewIDs。词典有两个键,第一个是ReviewID#,第二个是Review的语言。如何计算字典中各种字符串的实例数

我的任务是计算每种语言的评论总数,然后将其显示在条形图中。

import pandas as pd 
import csv 
import matplotlib.pyplot as plt 
import sys 
RevDict = {} 
with open('ReviewID.txt','r') as f: 
for line in f: 
    a,b = line.split(":") 
    RevDict[a] = str(b) 

这导致了看起来像这样一本字典:

enter image description here

我的想法,就是到字典转换成数据帧与评价编号为一列,语言是第二柱。然后我可以使用计数器遍历行,并最终得出每种语言的最终计数。这可以很容易地转换成条形图。

不幸的是,我无法弄清楚如何做到这一点。

我还怀疑pythonic方法会更简单地计算字典本身内每个字符串的实例数量,而不是通过制作数据帧的步骤。我尝试这样做:

from collections import Counter 
Counter(k['b'] for k in data if k.get('b')) 

它抛出以下错误:

AttributeError的:“海峡”对象有没有属性“得到”

回答

2

使用collections.Counter

import collections as coll 

data = { 
    'A': 'English', 
    'B': 'German', 
    'C': 'English' 
} 

print(coll.Counter(data.values())) 

--output:-- 
Counter({'English': 2, 'German': 1}) 

使用pandas

import pandas as pd 

data = { 
    'A': 'fr\n', 
    'B': 'de\n', 
    'C': 'fr\n', 
    'D': 'de\n', 
    'E': 'fr\n', 
    'F': 'en\n' 
} 

df = pd.DataFrame(
    { 
     'id': list(data.keys()), 
     'lang': [val.rstrip() for val in data.values()], 
    } 
) 

print(df) 

输出:

id lang 
0 B de 
1 A fr 
2 F en 
3 D de 
4 E fr 
5 C fr 

grouped = df.groupby('lang') 
print(grouped.size()) 

输出:

lang 
de 2 
en 1 
fr 3 

Respon SE发表评论

Plotting

import collections as coll 
import matplotlib.pyplot as plt 
import numpy as np 
from operator import itemgetter 

data = { 
    'A': 'fr\n', 
    'B': 'de\n', 
    'C': 'fr\n', 
    'D': 'de\n', 
    'E': 'fr\n', 
    'F': 'en\n' 
} 

counter = coll.Counter(
    [val.rstrip() for val in data.values()] 
) 

langs, lang_counts = zip(
    *sorted(counter.items(), key=itemgetter(1)) 
) 
total_langs = sum(lang_counts) 

bar_heights = np.array(lang_counts, dtype=float)/total_langs 
x_coord_left_side_of_bars = np.arange(len(langs)) 
bar_width = 0.8 

plt.bar(
    x_coord_left_side_of_bars, 
    bar_heights, 
    bar_width, 
) 

plt.xticks( 
    x_coord_left_side_of_bars + (bar_width * 0.5), #position of tick marks 
    langs #labels for tick marks 
) 
plt.xlabel('review language') 
plt.ylabel('% of all reviews') 

x = plt.plot() 
#plt.show() #Can use show() instead of savefig() until everything works correctly 
plt.savefig('lang_plot.png') 

情节:使用collections.Counter工作

enter image description here

+0

字典方法。我现在有一个输出看起来像是一个字典,其中列出了各种语言的降序排列的实例数量。最后一步是,我需要将其显示在条形图中,以显示每种语言所代表的评论百分比。我假设这是一个matplotlib函数,但我不清楚如何从字典中提取数据来创建此图。 –

+0

@AndrewSmith,计数器是无序的,这意味着你不能指望任何特定的密钥排序。请参阅我的答案底部的matplotlib示例。 – 7stud

1

在你for k in data循环中,每个k是一个字符串键(评论id)。字符串没有.get()方法,原始变量b对此循环也没有任何影响。

如果你想算值,只是通过字典的值直奔Counter

Counter(data.values()) 

你可能想先删除换行符:

for line in f: 
    review_id, lang = line.split(":") 
    RevDict[review_id] = lang.strip()