Python 按索引的数据透视表聚合
我有两个数据框,包含关于学生成绩和考试分数的信息。第一个是这样的:Python 按索引的数据透视表聚合,python,pandas,pivot-table,Python,Pandas,Pivot Table,我有两个数据框,包含关于学生成绩和考试分数的信息。第一个是这样的: ID Test_Score Class1 Class2 Class3 0 001 85 B- A C+ 1 002 78 B NaN B+ 2 003 93 A B NaN ... 0
ID Test_Score Class1 Class2 Class3
0 001 85 B- A C+
1 002 78 B NaN B+
2 003 93 A B NaN
...
0 1
0 Algebra A
0 Calculus_1 B
0 Calculus_2 C-
1 Algebra C+
1 Trig F
1 Trig C
1 Calculus_1 C-
...
第二个是这样的:
ID Test_Score Class1 Class2 Class3
0 001 85 B- A C+
1 002 78 B NaN B+
2 003 93 A B NaN
...
0 1
0 Algebra A
0 Calculus_1 B
0 Calculus_2 C-
1 Algebra C+
1 Trig F
1 Trig C
1 Calculus_1 C-
...
每个数据帧中的索引都指向同一个学生。因此,索引0处的学生在两个数据帧中是相同的
我要做的是从第二个数据帧创建一个透视表,其中行对应于学生,即索引,列是数学类,值是他们在每个类中取得的最高分数,因为学生有可能多次上课。然后,我将把它连接到第一个数据帧
我已经编写了一个聚合函数,可以找到最高等级
我尝试了以下方法,但知道它会失败:
p = pd.pivot_table(u, columns=0, values=1, aggfunc=highest)
我没有为每个学生返回一个包含一行的数据框,而是得到一行,其中包含给定班级中所有学生的最高分数:
Algebra Trig Precalculus Calculus_1 Calculus_2
1 A A+ A+ A A
按照我在脑海中构思问题的方式,我只需要在索引中共享的行之间进行聚合,我不确定该如何做
我也愿意接受完全不同的方法
期望输出:
ID Test_Score Class1 Class2 Class3 Algebra Trig ...
0 001 85 B- A C+ A NaN
1 002 78 B NaN B+ C+ C
2 003 93 A B NaN B B-
...
编辑:
以下是我的“最高”功能的代码:
def highest(x):
q = 0
z = None
for g in x:
if qpoints(g) > q:
q = qpoints(g)
z = g
return z
其中qpoints是我在别处已经使用过的以下函数:
def qpoints(x):
qvalue = {'W': 0,
'F': 0,
'D': 1.0,
'D+': 1.33,
'C-': 1.67,
'C': 2.0,
'C+': 2.33,
'B-': 2.67,
'B': 3.0,
'B+': 3.33,
'A-': 3.84,
'A': 4.0,
'A+': 4.0}
return qvalue[x]
这就是你想要的。但是,使用pivot时,不允许有重复的列名,因此对同一用户使用两次Trig将导致错误 因此,在将重复的Trig值重命名为Trig2之后,join/pivot工作得很好
df = pd.DataFrame({'ID':['001','002','003'],'Test_Score':[85,78,93],'Class1':['B-','B','A'],'Class2':['A','','B'],'Class3':['C+','B+','',]})
df2 = pd.DataFrame({0:['Algebra','Calculus_1','Calculus_2','Algebra','Trig','Trig2','Calculus_1'],1:['A','B','C-','C+','F','C','C-']}, index=[0,0,0,1,1,1,1])
df.join(df2.pivot(columns=0, values=1))
ID Test_Score Class1 Class2 Class3 Algebra Calculus_1 Calculus_2 Trig Trig2
0 001 85 B- A C+ A B C- NaN NaN
1 002 78 B B+ C+ C- NaN F C
2 003 93 A B NaN NaN NaN NaN NaN
您的问题是,在透视表时需要保留第二个数据帧的索引值,请参阅以获取理解。因此,如果你这样做:
print (df2.reset_index().pivot_table(index='index', values=[1], columns=[0],
aggfunc= lambda x: sorted(x)[0]))
# I used my own idea of highest function
1
0 Algebra Calculus_1 Calculus_2 Trig
index
0 A B C- NaN
1 C+ C- NaN C
然后你可以这样做:
您能为最高的函数提供代码吗?看起来您希望以第二个数据帧为轴心,然后与索引上的第一个df合并。@iamChoosingName为最高的函数添加了代码。