Pandas 将数据帧与不同级别的索引串联在一起

Pandas 将数据帧与不同级别的索引串联在一起,pandas,multi-index,Pandas,Multi Index,我很难理解熊猫多索引是如何工作的。 具体而言: 如何合并不同索引级别的两个数据帧(按行) 如何更改数据帧的索引级别 使用以下示例: 我计算两个数据集 def ZahlOccurence_0(x): return pd.Series({'All': len(x['StudentID']), 'Part': sum(x['Participated'] == 'yes'), 'Pass' : sum(x['Pass

我很难理解熊猫多索引是如何工作的。 具体而言:

  • 如何合并不同索引级别的两个数据帧(按行)
  • 如何更改数据帧的索引级别
  • 使用以下示例:

    我计算两个数据集

    def ZahlOccurence_0(x):
         return pd.Series({'All': len(x['StudentID']),
                       'Part': sum(x['Participated'] == 'yes'),
                       'Pass' :  sum(x['Passed'] == 'yes')})
    t1 = d1.groupby(['ExamenYear', 'Exam']).apply(ZahlOccurence_0)   
    t2 = d1.groupby('ExamenYear').apply(ZahlOccurence_0)   
    
    如何按行合并t1和t2

    print t1
                        All  Part  Pass
    ExamenYear Exam                    
    2007       algebra    1     0     0
               bio        1     1     1
               stats      1     1     1
    2008       algebra    2     1     1
               stats      2     2     2
    2009       algebra    1     1     1
               bio        2     2     1
    
    print t2 
    
                All  Part  Pass
    ExamenYear                 
    2007          3     2     2
    2008          4     3     3
    2009          3     3     2
    
    我尝试了以下方法

    t2 = t2.set_index([t2.index, np.array(['tot']* 3)], append = False)
    
    但是

    产生错误

    ValueError:无法在数据帧上调用bool()。

    我做错了什么


    提前感谢@DSM指出数据帧对象需要在列表中

    pd.concat([t1, t2])
    
    我必须进行与你类似的计算。这是我喜欢的方法

    t2['Exam'] = 'tot'
                All  Part  Pass Exam
    ExamenYear
    2007          3     2     2  tot
    2008          4     3     3  tot
    2009          3     3     2  tot
    
    pd.concat([t1.reset_index(),t2.reset_index()], ignore_index=True)
    
       All     Exam ExamenYear  Part  Pass
    0    1  algebra       2007     0     0
    1    1      bio       2007     1     1
    2    1    stats       2007     1     1
    3    2  algebra       2008     1     1
    4    2    stats       2008     2     2
    5    1  algebra       2009     1     1
    6    2      bio       2009     2     1
    7    3      tot       2007     2     2
    8    4      tot       2008     3     3
    9    3      tot       2009     3     2
    

    正如@DSM指出的,DataFrame对象需要在一个列表中

    pd.concat([t1, t2])
    
    我必须进行与你类似的计算。这是我喜欢的方法

    t2['Exam'] = 'tot'
                All  Part  Pass Exam
    ExamenYear
    2007          3     2     2  tot
    2008          4     3     3  tot
    2009          3     3     2  tot
    
    pd.concat([t1.reset_index(),t2.reset_index()], ignore_index=True)
    
       All     Exam ExamenYear  Part  Pass
    0    1  algebra       2007     0     0
    1    1      bio       2007     1     1
    2    1    stats       2007     1     1
    3    2  algebra       2008     1     1
    4    2    stats       2008     2     2
    5    1  algebra       2009     1     1
    6    2      bio       2009     2     1
    7    3      tot       2007     2     2
    8    4      tot       2008     3     3
    9    3      tot       2009     3     2
    

    如果键入
    help(pd.concat)
    ,您将看到它将对象集合作为第一个参数。注意,它应该是
    pd.concat([t1,t2])
    。不过,我不确定您希望得到什么样的输出:它是否类似于
    pd.concat([t1,t2]).sort()
    ?也许这就是您想要的t2['Exam']='tot';pd.concat([t1.reset_index(),t2.reset_index()])真傻!谢谢DSM:我只是忘了把对象放在列表中:-(@user1827356:这就是我要找的,而且做得很复杂。你能把你的评论作为回复发布出来,这样我就可以接受它并结束问题了吗?如果你键入
    help(pd.concat)
    您将看到它以一组对象作为第一个参数。瞧,它应该是
    pd.concat([t1,t2])
    。不过,我不确定您希望得到什么样的输出:它是否类似于
    pd.concat([t1,t2]).sort()
    ?也许这就是您想要的?-t2['Exam'='tot';pd.concat([t1.reset_index()),t2.reset_index())我真傻!谢谢!!!!!DSM:我只是忘了把对象放在列表中:-(@user1827356:这就是我一直在寻找的,而且做得很复杂。你能把你的评论作为一个回复,这样我就可以接受它并结束这个问题吗?谢谢。我对熊猫很陌生,但对它的功能很兴奋。谢谢。我对熊猫很陌生,但对它的功能很兴奋。