【问题标题】:Keep all indexes in multilevel pandas groupby将所有索引保留在多级熊猫 groupby 中
【发布时间】:2015-11-23 02:06:11
【问题描述】:

我有以下数据框:

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

【问题讨论】:

    标签: python pandas dataframe indexing pandas-groupby


    【解决方案1】:

    您可以像这样从您的数据中创建一个新的MultiIndexreindex

    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() 返回的 DataFrame:

      >>> 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) 来纠正此问题。

      【讨论】:

        猜你喜欢
        • 2017-09-21
        • 2017-11-21
        • 1970-01-01
        • 2020-03-11
        • 1970-01-01
        • 1970-01-01
        • 2019-02-28
        • 2020-10-12
        • 2018-08-01
        相关资源
        最近更新 更多