2017-02-25 69 views
1

我一直在研究這個代碼,它總結了從我的數據框中的3個賦值和1個測試的得分,並根據下面的公式生成標記(A,B,C,D,F)分數。高效而乾淨的寫這段代碼的方法 - 熊貓

這是我的數據幀。

StudentId, Assignment1, Assignment2, Assignment3, Test 
xxxxxxxx  11   15   7  50 
yyyyyyyy  5   10   2  31 

這是我的代碼來總結分數和生成馬克

SumScoreX = [] 
GradeX = [] 
for x in xrange(len(df)): 
    A1, A2, A3, T1 = df['Assignment1'][x], df['Assignment2'][x],df['Assignment3'][x], df['Test'][x] 
    SumScore = np.sum([A1,A2,A3,T1]) 
    if SumScore < 51: 
     Grade = 'F' 
    elif SumScore == 50 and SumScore < 60: 
     Grade = 'D' 
    elif SumScore == 60 and SumScore < 70: 
     Grade = 'C' 
    elif SumScore == 70 and SumScore < 80: 
     Grade = 'B' 
    elif SumScore <= 80: 
     Grade = 'A' 
    SumScoreX.append(np.round(SumScore)) 
    GradeX.append(Grade) 

我的代碼看起來非常潔淨。我覺得應該有一個更好的方式來編寫與此代碼具有類似功能的代碼。

請告訴我。

謝謝!

回答

2

假設你有以下DF:

In [100]: df 
Out[100]: 
    StudentId Assignment1 Assignment2 Assignment3 Test 
0 xxxxxxxx   11   15   7 50 
1 yyyyyyyy   5   10   2 31 

首先計算出score

In [101]: df['score'] = df.filter(regex=r'(?:Assignment\d*|Test)').sum(1) 

現在我們可以使用pd.cut()方法分類的分數:

In [102]: df['grade'] = pd.cut(df.score, bins=[0, 51, 60, 70, 80, 200], labels=list('FDCBA')) 

In [103]: df 
Out[103]: 
    StudentId Assignment1 Assignment2 Assignment3 Test score grade 
0 xxxxxxxx   11   15   7 50  83  A 
1 yyyyyyyy   5   10   2 31  48  F 
+1

哦,哇,這太棒了。謝謝你,我也學到了一些新東西。 –

+0

@ Niche.P,很高興我能幫忙:) – MaxU