Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按索引的数据透视表聚合_Python_Pandas_Pivot Table - Fatal编程技术网

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为最高的函数添加了代码。