2017-10-16 48 views
0

我正在尝试做回年,每年的平均分数。 我想要做的是创建一个符合年份的字典:年级,然后得到另一个年份字典:sum_of_grade然后等等。创建一个字典,提取平均数字

它从csv文件,它有两个头是:一年级

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

还有很多,但我不认为这是需要有完整的数据。

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} 

因为在构造字典中存在重复键时,该值将被覆盖。

那么,要实现这一点,我建议用另一种字典生成方法,做这样的事情:

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 

在中间字典d,价值节省约[sum_of_grade,times_appeared_in_the_year信息],因此当迭代字典时,可以使用sum_of_grade/times_appeared_in_the_year轻松地使用来计算平均值。

所以,当你看到一个表(CSV文件是一个),你应该觉得熊猫(我认为)你并不需要尽快使用额外的变量等级

+0

怎么了我在years.append()?它应该是年吗?另外,在这种情况下,我不明白如何添加成绩。 – Mayjunejuly

+0

是的,我很抱歉,今年。这个年级附加在这里:'''d [year] = [grade,1]''',当你第一次见面* 2001,100 *时。中间字典将是{2001:[100,1]},然后符合* 2001,88 *。中间字典将是{2001:[188,2],2002:[99,1]}。因为您只想返回平均成绩,所以我认为我们可以保存成绩的总和以及列表中的成绩数。没有必要附加实际的成绩值。 – Ballack

+0

您的代码正常工作,但这不考虑订单吗?因为它是所有重要的,而不是从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

这里是一个大熊猫溶液:

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:

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

非常真实。我理解大熊猫在这里工作得很好。但由于某种原因,这项任务阻止了我使用熊猫。 – Mayjunejuly