在pandas上显示所有索引组合然后求和

时间:2018-03-19 00:45:33

标签: python pandas multi-index

我有4个索引Dataframe,我想知道如何确保显示所有索引组合。

我正在运行此总结:

df.sum(level=[0,1,2,3]).unstack(fill_value=0).stack()

但它只显示第三个索引的第四个索引的所有可能值。我希望这也适用于第一个和第二个索引(用0填充空行)。

谢谢

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

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

按照设计,按分类列的MultiIndex分组会产生笛卡尔积。

以下是一个小例子。

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