如何使用 MultiIndex 将“总计”行附加到 pandas 数据框

abo*_*vel 7 python pandas

假设您有一个带有 MultiIndex 的简单 pandas 数据框:

df = pd.DataFrame(1, index=pd.MultiIndex.from_tuples([('one', 'elem1'), ('one', 'elem2'), ('two', 'elem1'), ('two', 'elem2')]),
                  columns=['col1', 'col2'])
Run Code Online (Sandbox Code Playgroud)

打印为表格:

           col1  col2
one elem1     1     1
    elem2     1     1
two elem1     1     1
    elem2     1     1
Run Code Online (Sandbox Code Playgroud)

问题:如何向该数据框添加“总计”行?

预期输出:

             col1  col2
one   elem1   1.0   1.0
      elem2   1.0   1.0
two   elem1   1.0   1.0
      elem2   1.0   1.0
Total         4.0   4.0
Run Code Online (Sandbox Code Playgroud)

第一次尝试:简单的实现

如果我只是忽略 MultiIndex 并遵循标准方式

df.loc['Total'] = df.sum()
Run Code Online (Sandbox Code Playgroud)

输出:

              col1  col2
(one, elem1)     1     1
(one, elem2)     1     1
(two, elem1)     1     1
(two, elem2)     1     1
Total            4     4
Run Code Online (Sandbox Code Playgroud)

看起来是正确的,但是 MultiIndex 转换为Index([('one', 'elem1'), ('one', 'elem2'), ('two', 'elem1'), ('two', 'elem2'), 'Total'], dtype='object')


第二次尝试:明确

           col1  col2
one elem1     1     1
    elem2     1     1
two elem1     1     1
    elem2     1     1
Run Code Online (Sandbox Code Playgroud)

或者(感到沮丧并出于恶意而改变轴)

             col1  col2
one   elem1   1.0   1.0
      elem2   1.0   1.0
two   elem1   1.0   1.0
      elem2   1.0   1.0
Total         4.0   4.0
Run Code Online (Sandbox Code Playgroud)

输出(两次调用相同):

             col1  col2
one   elem1   1.0   1.0
      elem2   1.0   1.0
two   elem1   1.0   1.0
      elem2   1.0   1.0
Total         NaN   NaN
Run Code Online (Sandbox Code Playgroud)

MultiIndex 未转换,但 Total 错误 (NaN != 4)。

abo*_*vel 9

解决方案

您必须删除索引df.sum()并仅使用值:

df.loc['Total', :] = df.sum().values
Run Code Online (Sandbox Code Playgroud)

输出:

             col1  col2
one   elem1   1.0   1.0
      elem2   1.0   1.0
two   elem1   1.0   1.0
      elem2   1.0   1.0
Total         4.0   4.0
Run Code Online (Sandbox Code Playgroud)

为什么第二次尝试就错了?

第二次尝试几乎是正确的。但 df.sum() 有Index(['col1', 'col2'], dtype='object'). 因此,pandas 无法匹配索引。新索引 ('Total', '') 已附加,但没有值。

但为什么df.loc['Total', :] = df.sum(axis=1)也失败了呢?它具有正确的多重索引。Pandas 完全按照你所说的去做,即对列求和。因此,df.sum(axis=1)为您提供以下数据框:

one  elem1    2
     elem2    2
two  elem1    2
     elem2    2
Run Code Online (Sandbox Code Playgroud)

该数据框在任何有意义的意义上都无法与原始数据框匹配df