2017-10-16 14 views
0

私は戻って年をしようとしています、毎年の等級の平均。 私がしようとしていたのは、year:gradeに合った辞書を作成し、year_of_gradeなどの別の辞書を取得することでした。平均の配列を抽出して辞書を作成する

Year Grade 
2001 100 
2002 99 
2001 88 
2003 11 
2005 55 

は、より多くありますが、私はそれが全体のデータを持っていることが必要だとは思わない年とグレード:

これは、CSV形式の2つのヘッダを持つファイル、からです。

def construct_values(file): 
    """ 
    Construct the values needed to graph the average grade of the class over time 

    Parameters 
    ---------- 
    file_path: A string. Absolute path to file. 

    Returns 
    ------- 
    years: array of integers 
    average_grades: array of floats 
    """ 
    years, average_grades = [], [] 
    grades = [] 
    d = {} 
    with open(file,'r') as f: 
     next(f) 
     for line in f: 
      year, grade = (s.strip() for s in line.split(',')) 
      years.append(year) # array year 
      grades.append(grade) # array grade 
      d = dict(zip(years,grades)) # dict year:grade 

     for i,j in d: 
      # i for count frequencies of years 
      # j for summation of grades 
      # j/i for average grade and extract as array 


     return years, average_grades 

私は明確にしようとしましたが、それでも明らかでない場合はお知らせください。

答えて

1

あなたがこれを使用するときに問題があります:

d = dict(zip(years,grades)) # dict year:grade

では、例として、あなたの入力データを取り、それはのような辞書を生成します。

{2001: 88, 2002: 99, 2003:11, 2005: 55} 

コンストラクトディクショナリでキーが重複していると、値がオーバーライドされるためです。 [sum_of_grade、times_appeared_in_the_yearについての情報を保存D真ん中辞書で、値を

def construct_values(file): 
    """ 
    Construct the values needed to graph the average grade of the class over time 

    Parameters 
    ---------- 
    file_path: A string. Absolute path to file. 

    Returns 
    ------- 
    years: array of integers 
    average_grades: array of floats 
    """ 
    years, average_grades = [], [] 
    # grades = []  This variable don't need anymore 
    d = {} 
    with open(file,'r') as f: 
     next(f) 
     for line in f: 
      year, grade = (s.strip() for s in line.split(',')) 

      # here is the begin line difference from your code 
      if year not in d: 
       d[year] = [int(grade), 1] 
      else: 
       d[year][0] += int(grade) 
       d[year][1] += 1 

     for year, grade_info in d.items(): 
      years.append(year) 
      average_grades.append(grade_info[0]/grade_info[1]) 
      # end difference from your code 

     return years, average_grades 

だから、これを達成するために、私はこのような何かを、別の辞書を使用する方法を生成することをお勧めします]ので、辞書を反復するときには、sum_of_grade/times_appeared_in_the_yearを使用して平均を計算することが簡単にできます。

だから、あなたはできるだけ早くあなたがテーブルを見るように、追加の変数グレード

+0

元気Iと()?それは年とされていますか?また、私はこの場合にどのように等級を付けることができません。 – Mayjunejuly

+0

ええ、すみません、それは年です。あなたが最初に* 2001,100 *を見たときに、グレードはここに追加されます: '' '[year] = [grade、1]' ''。中間の辞書は{2001:[100、1]}であり、次に* 2001,88 *を満たす。中間の辞書は{2001:[188、2]、2002:[99、1]}になります。あなたは単に平均的な成績を返したいので、成績の合計と成績の数をリストに保存できると思います。実際の成績値を追加する必要はありません。 – Ballack

+0

あなたのコードは動作しますが、これは注文を考慮しませんか? cuzそれはすべてのarond、例えば2001年から始まっていないシャッフルされています。 – Mayjunejuly

0

dict(zip(years,grades))のように作成されている間は、重複キーでは辞書を使用できません。だから辞書以外の方法を使うのが良い。

このようなものもあります。

from itertools import groupby 
combined = zip(year,grade)  
for n,g in groupby(sorted(combined, key = lambda x:x[0]),key=lambda x:x[0]): 
    grades = [int(i[1])for i in g] 
    print 'year : %s average : %s' %(n,sum(grades)/len(grades)) 

結果:

year : 2001 average : 94 
year : 2002 average : 99 
year : 2003 average : 11 
year : 2005 average : 55 
1

を使用する必要はありません(CSVファイルは1である)あなたがパンダ(私の意見)を考える必要があります。ここで

パンダソリューションです:

import pandas as pd 
import io 

csv = """Year,Grade 
2001,100 
2002,99 
2001,88 
2003,11 
2005,55""" 

df = pd.read_csv(io.StringIO(csv)) 

year_grade = {k: list(v) for k,v in df.groupby("Year")["Grade"]} 
year_avg_grade = df.groupby("Year")["Grade"].mean().to_dict() 

year_grade:

{2001: [100, 88], 2002: [99], 2003: [11], 2005: [55]} 

year_avg_grade:years.appendで

{2001: 94, 2002: 99, 2003: 11, 2005: 55} 
+0

非常に真です。私はパンダがここでうまくいくと理解しています。しかし何らかの理由で、この割り当てによって私はパンダを使用できなくなります。 – Mayjunejuly

関連する問題