Python 显示索引的所有组合,然后求和

Python 显示索引的所有组合,然后求和,python,pandas,multi-index,Python,Pandas,Multi Index,我有一个4索引数据框,我想知道如何确保显示所有索引组合 我这样做是为了总结: df.sum(level=[0,1,2,3]).unstack(fill_value=0).stack() 但它只显示第四个索引的所有可能值,而第三个索引中的每一个都显示第四个索引的所有可能值。我希望这也适用于第一个和第二个索引(用0填充空行) 谢谢你可以试试 s=df.sum(level=[0,1,2,3]) idx=pd.MultiIndex.from_product([s.index.get_level_val

我有一个4索引数据框,我想知道如何确保显示所有索引组合

我这样做是为了总结:

df.sum(level=[0,1,2,3]).unstack(fill_value=0).stack()
但它只显示第四个索引的所有可能值,而第三个索引中的每一个都显示第四个索引的所有可能值。我希望这也适用于第一个和第二个索引(用0填充空行)

谢谢你可以试试

s=df.sum(level=[0,1,2,3])
idx=pd.MultiIndex.from_product([s.index.get_level_values(0).unique(),s.index.get_level_values(1).unique(),s.index.get_level_values(2).unique(),s.index.get_level_values(3).unique()])

s.reindex(idx)

您可以在执行
groupby
之前转换为类别,然后使用
fillna

根据设计,通过分类列的多索引进行分组可以得到它们的笛卡尔乘积

下面是一个小例子

import pandas as pd, numpy as np

df = pd.DataFrame({'A': np.random.randint(0, 2, 5),
                   'B': np.random.randint(0, 2, 5),
                   'C': np.random.randint(0, 2, 5),
                   'D': np.random.randint(0, 2, 5),
                   'E': np.random.rand(5)})

for col in ['A', 'B', 'C', 'D']:
    df[col] = df[col].astype('category')

res = df.groupby(['A', 'B', 'C', 'D']).sum().fillna(0)
结果

                E
A B C D          
0 0 0 0  0.982165
      1  0.000000
    1 0  0.000000
      1  0.000000
  1 0 0  0.000000
      1  0.366428
    1 0  0.000000
      1  0.000000
1 0 0 0  0.000000
      1  0.606826
    1 0  0.000000
      1  0.164896
  1 0 0  0.000000
      1  0.000000
    1 0  0.027386
      1  0.000000

请提供您正在处理的df示例和预期输出。