2017-10-16 1 views
0

나는 매년 반환 학년을하려고합니다. 각 학년의 평균을 말합니다. 내가 뭘하려고했는지는 년 : 학년에 맞는 사전을 만든 다음 년의 다른 사전을 얻는 것입니다 : sum_of_grade 등등.평균 배열을 추출하는 사전 작성

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

더 많은이 있습니다,하지만 난 그것을 전체 데이터를 가질 필요가 생각하지 않습니다 년 등급 :

은 CSV의 두 헤더를 가지고 파일에서입니다.

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

예로 입력 데이터를 타고을, 그것이 생성하는 DICT 같은 :

{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을 사용하여 평균을 계산할 수 있습니다.

그리고 당신은 테이블 당신은 팬더 (내 의견을) 생각해야한다 (CSV 파일이 하나되는)를 참조하십시오 정도로, 당신은 즉시 추가 변수를 등급

+0

뭐죠 내가 최대 years.append에서()? 그것은 1 년이 될 예정입니까? 또한, 나는이 경우 성적이 추가 될 수있는 방법을 얻지 못합니다. – Mayjunejuly

+0

그래, 미안, 일 년이야. 학년은 * 2001, 100 *을 처음 만났을 때'''[year] = [grade, 1]''로 여기에 덧붙여집니다. 중간 사전은 {2001 : [100, 1]}이 될 것이고 * 2001, 88 *을 만날 것입니다. 중간 사전은 {2001 : [188, 2], 2002 : [99, 1]}입니다. 당신은 단지 평균 성적을 반환하기를 원하기 때문에, 우리는 성적의 합계와 성적의 수를 목록에 저장할 수 있다고 생각합니다. 실제 성적을 추가 할 필요는 없습니다. – Ballack

+0

코드가 작동하지만 주문과 관련없는 것으로 간주합니까? 사촌 그것은 예를 들어, 2001 년부터 시작하지 않고 모든 arond를 섞는다. – 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