pandas 创建将所有项追加到DataFrame的类

eni9jsuy  于 2023-01-19  发布在  其他
关注(0)|答案(1)|浏览(175)

我在执行下面的任务时遇到了麻烦。我需要创建一个类来容纳所有学生的学生ID、姓名和成绩。我的想法是创建一个空的DataFrame来追加我添加到类中的值。我得出了下面的结果。

class Student:
    
    students_archive = pd.DataFrame(index = 'student_id', columns = ['student_id', 'name', 'grade'])
    
    def __init__(self, s_id, name, grade):
        self.s_id = s_id
        self.name = name
        self.grade = grade
        st = {'student_id': self.s_id,'name': self.name, 'grade': self.grade}
        pd.concat([Student.students_archive, st])

但是,我得到以下错误:
如果使用所有标量值,则必须传递索引
我真的不明白出了什么问题,我已经到处看了看,有人能帮助我吗?谢谢,我也忍不住认为我的方法是错误的,因为任务实际上并没有指定它需要是一个 Dataframe ,只是说我必须“创建一个类,容纳学生的姓名,年级和id,并创建方法添加,删除或升级学生的值。也许我可以不创建 Dataframe 就完成所有这些操作?谢谢

hmae6n7t

hmae6n7t1#

我还不能发表评论,所以这里有一个答案。
运行代码显示了2个错误:
1.这个index = 'student_id'应该更像这个index = ['student_id']
1.此pd.concat([Student.students_archive, st])不接受字典,而接受类似pd.concat([dataframe_0, dataframe_1])的内容
另外,我认为如果你在__init__()中添加你的 Dataframe 会更好。
因此,它应该会产生如下结果:

class Student:

    def __init__(self, s_id, name, grade):
        self.s_id = s_id
        self.name = name
        self.grade = grade
        self.students_archive = pd.DataFrame(index = ['student_id'], columns = ['student_id', 'name', 'grade'])
        temp_df = pd.DataFrame.from_dict({'student_id': [self.s_id],'name': [self.name], 'grade': [self.grade]})
        new_temp_df = pd.concat([self.students_archive, temp_df])

但是请记住,temp_dfnew_temp_df可能会被垃圾收集,因此,添加self.可以保留您想要的内容
我的理解是:

template = pd.DataFrame(index = ['student_id'], columns = ['student_id', 'name', 'grade'])
entries = pd.DataFrame.from_dict({'student_id': [self.s_id],'name': [self.name], 'grade': [self.grade]})
self.student_df = pd.concat([template, entries])
    • 更新日期:**

阅读了你的评论和你链接的代码,示例化每个学生似乎超出了范围,但你似乎走在了正确的道路上。
1.我仍然会在__init__()里面添加主 Dataframe ,让它更整洁。你仍然可以从类之外访问它(更多见下文)。
1.通过方法(add/remove/update)合并所需的功能,这是您开始做的。
1.这种方法是否正确可能取决于你的教授,以及他们是否禁止像Pandas这样的图书馆。我不认为有什么错,因为它给了你很多需要的东西。
所以,在代码中我会建议这样的东西:

class Students:
    def __init__(self):
        # keep in mind that pandas will add another column to the left for row id (0, 1, 2, etc..)
        self.df = pd.DataFrame(columns = ['student_id', 'name', 'grade'])
        
    def add_student(self, s_id, nm, gr):
        # a new dataframe is returned from .append() containing the new values, we replace our old on with that
        self.df = self.df.append({'student_id':s_id, 'name':nm, 'grade':gr}, ignore_index = True)

    def remove_student(self, s_id):
        # we are basically, getting a new dataframe without the rows that have s_id as their student_id
        self.df = self.df[self.df.student_id != s_id]
    
    # this could be broken down into 3 methods, 1 for each (id, name, grade)
    def update_student(self, s_id, nm, gr):
        # as i dont know how to update a row, i leave this as a placeholder:
        self.remove_student(s_id)
        self.add_student(s_id, nm, gr)

从外部访问 Dataframe 非常简单:

S = Student()
print(S.df)

相关问题