我的数据框类似于:
grades=pd.DataFrame(columns=["person","course_code","grade"],data=[[1,101,2.0],[2,102,1.0],[3,103,3.0],[2,104,4.0],[1,102,5.0],[3,104,2.5],[2,101,1.0]])
每一行是特定科目中某个学生的成绩。
并希望将其转换为另一个看起来像这样:
students=pd.DataFrame(columns=[101,102,103,104],data [[2.0,5.0,"NaN","NaN"],[1.0,1.0,"Nan",4.0],["Nan","Nan",3.0,2.5]])
每一行都是学生(行的编解码器),每个科目都有不同的成绩(每一栏都是不同的科目)。
我试过这样做:
for subj in grades["COURSE_CODE"].unique():
grades_subj=grades[grades["COURSE_CODE"]==subj]
grades_subj = grades_subj.set_index("EXPEDIENT_CODE", drop = True)
for st in grades["EXPEDIENT_CODE"].unique():
grade_num=grades_subj.loc[st]["GRADE"]
student.loc[st][subj]=grade_num
但我明白了:
KeyError: 'the label [304208] is not in the [index]'
我也尝试了其他方法并且总是出错......
有人可以帮助我吗?
答案 0 :(得分:1)
尝试:
grades.pivot_table(index='person', columns='course_code', values='grade')
value
参数允许您选择聚合列。
为了回答下面的评论,您可以在编制索引时始终添加不同的级别。这可以通过将列表而不是单个字符串传递给index
来完成。请注意,您可以在columns
中执行相同的操作。因此,基于您提供的示例。
grades.pivot_table(index=['person','school'], columns='course_code', values ='grade')
在此之后,我通常建议reset_index()
,除非您使用MultiIndex
进行流畅的切片和索引。
此外,如果对应关系是1到1,您可以使用适当的连接合并两个数据帧。
您可以在此处获得有关Pandas中Reshaping and Pivot Tables的所有信息。