2015-08-28 7 views
0

У меня есть следующий кадр данных:Держите все индексы в многоуровневые панд GroupBy

df = pd.DataFrame([[1.1, 1.1, 1.1, 2.6, 2.5, 3.4,2.6,2.6,3.4,3.4,2.6,1.1,1.1,3.3], list('AAABBBBABCBDDD'), [1.1, 1.7, 2.5, 2.6, 3.3, 3.8,4.0,4.2,4.3,4.5,4.6,4.7,4.7,4.8], ['1','3','3','2','4','2','5','3','6','3','5','1','1','1']]).T 
df.columns = ['col1','col2','col3','col4'] 

Когда я группа это я получаю:

df.groupby(['col4','col2']).sum() 

      col1 col3 
col4 col2    
1 A  1.1 1.1 
    D  5.5 14.2 
2 B  6.0 6.4 
3 A  4.8 8.4 
    C  3.4 4.5 
4 B  2.5 3.3 
5 B  5.2 8.6 
6 B  3.4 4.3 

Однако то, что я хотел бы иметь такой же второй уровень индекс для каждого индекса первого уровня. Это невозможно из-за отсутствия данных. То, что я хотел бы достичь, это:

  col1 col3 
col4 col2    
1 A  1.1 1.1 
    B  0  0 
    C  0  0 
    D  5.5 14.2 
2 A  0  0 
    B  6.0 6.4 
    C  0  0 
    D  0  0 
3 A  4.8 8.4 
    B  0  0 
    C  3.4 4.5 
    D  0  0 
4 A  0  0 
    B  2.5 3.3 
    C  0  0 
    D  0  0 
5 A  0  0 
    B  5.2 8.6 
    C  0  0 
    D  0  0 
6 A  0  0 
    B  3.4 4.3 
    C  0  0 
    D  0  0 

ответ

3

Вы можете создать новый MultiIndex из ваших данных, и reindex, как это.

In [6]: idx = pd.MultiIndex.from_product([df.col4.unique(), df.col2.unique()]) 

In [9]: (df.groupby(['col4','col2']).sum() 
      .reindex(idx).fillna(0)) 
Out[9]: 
    col1 col3 
1 A 1.1 1.1 
    B 0.0 0.0 
    C 0.0 0.0 
    D 5.5 14.2 
3 A 4.8 8.4 
    B 0.0 0.0 
    C 3.4 4.5 
    D 0.0 0.0 
2 A 0.0 0.0 
    B 6.0 6.4 
    C 0.0 0.0 
    D 0.0 0.0 
4 A 0.0 0.0 
    B 2.5 3.3 
    C 0.0 0.0 
    D 0.0 0.0 
5 A 0.0 0.0 
    B 5.2 8.6 
    C 0.0 0.0 
    D 0.0 0.0 
6 A 0.0 0.0 
    B 3.4 4.3 
    C 0.0 0.0 
    D 0.0 0.0 
2

Для учета недостающих показателей, вам, вероятно, нужно проиндексировать DataFrame возвращенное df.groupby(['col4','col2']).sum():

>>> m = pd.MultiIndex.from_product([df.col4.unique(), df.col2.unique()]) 
>>> df.groupby(['col4','col2']).sum().reindex(m, fill_value=0) 

    col1 col3 
1 A 1.1 1.1 
    B 0.0 0.0 
    C 0.0 0.0 
    D 5.5 14.2 
3 A 4.8 8.4 
    B 0.0 0.0 
    C 3.4 4.5 
    D 0.0 0.0 
2 A 0.0 0.0 
    B 6.0 6.4 
    C 0.0 0.0 
    D 0.0 0.0 
4 A 0.0 0.0 
    B 2.5 3.3 
    C 0.0 0.0 
    D 0.0 0.0 
5 A 0.0 0.0 
    B 5.2 8.6 
    C 0.0 0.0 
    D 0.0 0.0 
6 A 0.0 0.0 
    B 3.4 4.3 
    C 0.0 0.0 
    D 0.0 0.0 

Обратите внимание, что unique() возвращает значения в порядке их появления в столбце (например, «3» появляется перед «2» здесь). Вы можете исправить это, используя .sortlevel(0) на переиндексированном DataFrame.

 Смежные вопросы

  • Нет связанных вопросов^_^