python - 在 groupby 之后填充组中缺失的行

标签 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]
})

         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

但我想用零填充 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_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_value=0 保留 dtype int。如果没有它,当取消堆叠时,间隙将被 NaN 填充,并且 dtypes 会转换为 float

关于python - 在 groupby 之后填充组中缺失的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43479612/

相关文章:

Python Pandas Cumsum 在多种条件下每次都会重置

python - 将列标题添加到新的 pandas 数据框

python - 将 Pandas 数据框转换为包含字典或列表列表

python - Mechanize 引发 BrowserStateError

python - Pandas concat 结果与 NaN 不一致

python - wxPython:如何固定网格调整器的一部分的大小

python - 如何使用GAE在网站上显示youtube视频

python - pandas 根据多个条件迭代行,然后从列中减去?

python - 将 Spark API 数据帧上的 pandas 保存到 azure databricks 中的新表中

python - 透视具有重复项的非数值数据,不在 Pandas 中聚合,保留所有重复项