Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在groupby之后填充组中缺少的行_Python_Pandas - Fatal编程技术网

Python 在groupby之后填充组中缺少的行

Python 在groupby之后填充组中缺少的行,python,pandas,Python,Pandas,我有一些SQL数据,正在对它们进行分组和聚合。它工作得很好: grouped = df.groupby(['a', 'b']) agged = grouped.aggregate({ c: [numpy.sum, numpy.mean, numpy.size], d: [numpy.sum, numpy.mean, numpy.size] }) 及 但是我想用零填充a=25中的所有行,而不是a=26中的所有行。换句话说,类似于: c

我有一些SQL数据,正在对它们进行分组和聚合。它工作得很好:

grouped = df.groupby(['a', 'b'])
agged = grouped.aggregate({
    c: [numpy.sum, numpy.mean, numpy.size],
    d: [numpy.sum, numpy.mean, numpy.size]
})

但是我想用零填充
a=25中的所有行,而不是
a=26中的所有行。换句话说,类似于:

         c                         d 
         sum      mean   size      sum          mean size
a  b
25 20  107.0  0.804511  133.0  5328000  40060.150376  133
   21  110.0  0.774648  142.0  6031000  42471.830986  142
   23  126.0  0.792453  159.0  8795000  55314.465409  159
   24   72.0  0.947368   76.0  2920000  38421.052632   76
   25   54.0  0.818182   66.0  2570000  38939.393939   66
26 20      0         0      0        0             0    0
   21      0         0      0        0             0    0
   23  126.0  0.792453  159.0  8795000  55314.465409  159
   24      0         0      0        0             0    0
   25      0         0      0        0             0    0

我该怎么做

考虑数据帧
df

df = pd.DataFrame(
    np.random.randint(10, size=(6, 6)),
    pd.MultiIndex.from_tuples(
        [(25, 20), (25, 21), (25, 23), (25, 24), (25, 25), (26, 23)],
        names=['a', 'b']
    ),
    pd.MultiIndex.from_product(
        [['c', 'd'], ['sum', 'mean', 'size']]
    )
)

        c             d          
      sum mean size sum mean size
a  b                             
25 20   8    3    5   5    0    2
   21   3    7    8   9    2    7
   23   2    1    3   2    5    4
   24   9    0    1   7    1    6
   25   1    9    3   5    8    8
26 23   8    8    4   8    0    5
使用
unstack(fill\u value=0)
stack

df.unstack(fill_value=0).stack()

         c             d         
      mean size sum mean size sum
a  b                             
25 20    3    5   8    0    2   5
   21    7    8   3    2    7   9
   23    1    3   2    5    4   2
   24    0    1   9    1    6   7
   25    9    3   1    8    8   5
26 20    0    0   0    0    0   0
   21    0    0   0    0    0   0
   23    8    4   8    0    5   8
   24    0    0   0    0    0   0
   25    0    0   0    0    0   0

注意:使用
fill\u value=0
保留
dtype
int
。如果没有它,当取消堆叠时,间隙将被
NaN
填充,而
d类型将被转换为
float

打印(df)

我喜欢:

 df =  df.unstack().replace(np.nan,0).stack(-1)
 print(df)
                  c                           d                  
               mean   size    sum          mean   size        sum
    a  b                                                         
    25 20  0.804511  133.0  107.0  40060.150376  133.0  5328000.0
       21  0.774648  142.0  110.0  42471.830986  142.0  6031000.0
       23  0.792453  159.0  126.0  55314.465409  159.0  8795000.0
       24  0.947368   76.0   72.0  38421.052632   76.0  2920000.0
       25  0.818182   66.0   54.0  38939.393939   66.0  2570000.0
    26 20  0.000000    0.0    0.0      0.000000    0.0        0.0
       21  0.000000    0.0    0.0      0.000000    0.0        0.0
       23  0.792453  159.0  126.0  55314.465409  159.0  8795000.0
       24  0.000000    0.0    0.0      0.000000    0.0        0.0
       25  0.000000    0.0    0.0      0.000000    0.0        0.0

您的输出与您要求的不匹配
a==25
将是整个第一个块。你为什么要把
a==6
组中的行归零?我可能解释得不太清楚。基本上,我希望在分组完成后用0填充任何缺少的“行”,以便在其他情况下使用数据时,数据可以更“完整”
           c                         d                   
         sum      mean   size      sum          mean size
a  b                                                     
25 20  107.0  0.804511  133.0  5328000  40060.150376  133
   21  110.0  0.774648  142.0  6031000  42471.830986  142
   23  126.0  0.792453  159.0  8795000  55314.465409  159
   24   72.0  0.947368   76.0  2920000  38421.052632   76
   25   54.0  0.818182   66.0  2570000  38939.393939   66
26 23  126.0  0.792453  159.0  8795000  55314.465409  159
 df =  df.unstack().replace(np.nan,0).stack(-1)
 print(df)
                  c                           d                  
               mean   size    sum          mean   size        sum
    a  b                                                         
    25 20  0.804511  133.0  107.0  40060.150376  133.0  5328000.0
       21  0.774648  142.0  110.0  42471.830986  142.0  6031000.0
       23  0.792453  159.0  126.0  55314.465409  159.0  8795000.0
       24  0.947368   76.0   72.0  38421.052632   76.0  2920000.0
       25  0.818182   66.0   54.0  38939.393939   66.0  2570000.0
    26 20  0.000000    0.0    0.0      0.000000    0.0        0.0
       21  0.000000    0.0    0.0      0.000000    0.0        0.0
       23  0.792453  159.0  126.0  55314.465409  159.0  8795000.0
       24  0.000000    0.0    0.0      0.000000    0.0        0.0
       25  0.000000    0.0    0.0      0.000000    0.0        0.0