我试图在同一个脚本中生成两个函数—但是当我将它们导入主脚本并首先运行第一个finalGrade(grades)
时,grades
发生了变化,增加了一列'Final Grade'
。如何防止这种情况
在第一个函数中,我使用另一个函数返回每个学生的最终成绩数据集,如下所示:
# Made Andreas Døssing Mortensen s184507 & Mads Westergaard s180799
import numpy as np
import pandas as pd
from roundGrade import roundGrade
def computeFinalGrades(grades):
#making an array from dataFrame
arr=grades.values
#sorting and deleting the first two columns
gradesarr=np.sort(np.delete(arr,(0,1),axis=1))
#setting up a list for the final grades
gradesInList=np.zeros(len(gradesarr))
for i in range(len(gradesarr)):
#if -3 is in a row, the final grade should be = -3
if -3 in gradesarr[i]:
gradesInList[i]= -3
#if there is 2 or more grades in a row, execute the procedure below
elif len(gradesarr[i])>=2:
#Delete the smallest grade
meangrade=np.delete(gradesarr,0,axis=1)
#taking the mean of each row
finalgrade = np.mean(meangrade[i])
#making a list with all the final grades
gradesInList[i] = roundGrade(finalgrade)
# if there is only one value in the row, return that as the final grade
elif len(grades[i])==1:
gradesInList[i] = gradesarr
#Setting up the dataFrame again
df = pd.DataFrame(grades)
#Adding final grades to DataFrame
df['Final Grade']=gradesInList
#Show all columns
pd.set_option('display.max_columns', None)
gradesFinal=df
return gradesFinal
我的绘图函数如下所示:
#Importing add-ins
import matplotlib.pyplot as plt
import numpy as np
#import pandas as pd
#importing function
from computeFinalGrades import computeFinalGrades
def finalGrade(grades):
#Counting number of occurencies of each grade and set labels for x,y
computeFinalGrades(grades)['Final Grade'].value_counts().sort_index().plot("bar",title="Final grades").set(xlabel='Grades',ylabel='Count')
#show plot
plt.show()
return
def assignmentGrades(grades):
#create an array with all grades
array = grades.values
#Sorting and deleting "Name" and "StudentID" from the array
gradesarray = np.sort(np.delete(array,(0,1),axis=1))
#making a for loop, to iterate trough array
for i in range(len(gradesarray)):
#Defining the length of the array to define max x-values
num_ass = len(gradesarray[0])
#Setting the x-axis values to correspond with number of assignments + a jiggler in the interval [-.1,.1] on both axis
x = np.arange(1,num_ass+1) + np.random.uniform(-0.1,0.1)
y = gradesarray[i,:] + np.random.uniform(-0.1,0.1)
#Plotting the x,y "o" for creating scatterplot
plt.plot(x, y,"o")
#Drawing mean of grades as line
meangrade = np.mean(gradesarray,0)
#Plotting the mean grade as a line
plt.plot(x,meangrade)
#Set labels for x,y
plt.xlabel('Assignments')
plt.ylabel('Grades')
#show plot
plt.show()
return
希望你们能帮个忙,我好像想不通
我想告诉你我是如何找到解决你问题的方法的:
grades
在调用assignmentGrades
之后发生更改,然后有一个额外的列Final Grade
李>grades
,所以您可能会将其引用传递给另一个变量,然后更改它。 你已经做了两次了,arr = grades.values
和df = pd.DataFrame(grades)
一次李>Final Grade
列添加到df
grades
的类型可能是一个pd.DataFrame
,并且构造函数-当给定对另一个pd.DataFrame
的引用时-不会复制。所以最终df
与grades
在同一个对象上运行。当你改变一个,你就改变了另一个李>为了证明这一点,我编写了以下代码
它确实打印了更改的
a
和b
:要修复代码,请在创建
df
时使用grades
(grades.copy()
)的副本本可以帮助您解决这个问题的是一个调试器,它允许您逐步检查代码并查看变量的当前值。这样,您就可以看到
grades
何时发生变化,然后得出结论我还建议将
df
重命名为gradesFinal
,因为gradesFinal = df
不起任何作用相关问题 更多 >
编程相关推荐