在pandas Dataframe中查找

时间:2018-03-29 13:09:02

标签: python pandas dataframe

我的数据框类似于:

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]'

我也尝试了其他方法并且总是出错......

有人可以帮助我吗?

1 个答案:

答案 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的所有信息。