2017-01-22 2 views
0

大きなReviewIDを持つ辞書(10,000以上のエントリ)があります。辞書には2つのキーがあり、1つはReviewID#で、2つ目はレビューの言語です。辞書内のさまざまな文字列のインスタンス数をカウントする方法

私の任務は、各言語の総レビュー数を計算して棒グラフで表示することです。

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

私の考え、レビューIDが1列であることをデータフレームに辞書を変換することだった言語は、第二のものカラム。その後、カウンタを使用して行を繰り返し、各言語の最終的なカウントで終了します。これは簡単に棒グラフに変換することができます。

残念ながら、私はこれを行う方法を理解できません。

また、よりpythonのアプローチは、データフレームを作成するステップを経るのではなく、辞書自体の中の各文字列のインスタンスの数を単純に数えることだと考えられます。私はこれを試してみました:

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

それは、次のエラー投げている:

はAttributeError: 'strの' オブジェクトは、あなたのfor k in dataループで

答えて

2

collections.Counterを使用して、あなただけのストレート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

PlottingをコメントするSE:

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

プロット:

enter image description here

+0

collections.Counterを使用して辞書法で働いていました。私は今、降順でインスタンスの数を持つ様々な言語をリストした辞書のように見える出力を持っています。最後のステップは、これを棒グラフにして、各言語が表すレビューの割合を示す必要があることです。私はこれがmatplotlib関数であると仮定しますが、このグラフを作成するために辞書からデータを引き出す方法は不明です。 –

+0

@AndrewSmith、カウンターは順序付けされていません。つまり、キーの特定の順序を数えることはできません。私の答えの一番下にあるmatplotlibの例を見てください。 – 7stud

1

'を取得' は属性を持っていないが、各kは、文字列のキーです(レビューID)。文字列には.get()メソッドがなく、元の変数bもこのループに関係しません。

Counter(data.values()) 

をあなたはおそらく最初の改行文字を削除したい:

for line in f: 
    review_id, lang = line.split(":") 
    RevDict[review_id] = lang.strip() 
関連する問題