假设您有一个带有 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)。
您必须删除索引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。