2015-08-28 74 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

为了解决缺少的指标,你可能需要重新索引由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'之前)。您可以在重新编制索引的DataFrame上使用.sortlevel(0)来更正此问题。