返回分组中所有唯一值的汇总

7
问题在于这里。
假设我们有一个可以使用以下代码生成的 Pandas 数据框:
month=['dec','dec','dec','jan','feb','feb','mar','mar']
category =['a','a','b','b','a','b','b','b']
sales=[1,10,2,5,12,4,3,1]

df = pd.DataFrame(list(zip(month,category,sales)), 
                   columns =['month', 'cat','sales']) 

print(df)

| month cat  sales   |
|--------------------|
| 0   dec   a      1 |
| 1   dec   a     10 |
| 2   dec   b      2 |
| 3   jan   b      5 |
| 4   feb   a     12 |
| 5   feb   b      4 |
| 6   mar   b      3 |
| 7   mar   b      1 |

那假设我们想要按月份统计每个类别的数量。
那么我们可以执行以下操作:
```html

所以我们执行以下操作:

```
df=df.groupby(['month','cat']).sales.sum().reset_index()
print(df)
|  month cat  sales  |
|--------------------|
| 0   dec   a     11 |
| 1   dec   b      2 |
| 2   feb   a     12 |
| 3   feb   b      4 |
| 4   jan   b      5 |
| 5   mar   b      4 |

但我们想要看到的是:

|  month cat  sales  |
|--------------------|
| 0   dec   a     11 |
| 1   dec   b      2 |
| 2   feb   a     12 |
| 3   feb   b      4 |
| 4   jan   b      5 |
| 5   jan   a      0 |
| 6   mar   b      4 |
| 7   mar   a      0 |

在这里,不同之处在于没有出现在特定月份的类别仍然会显示为零作为它们的总数。

很可能这个问题以前已经被问过了,但是我找不到。如果你能指向那个问题,我们就可以删除这个。

3个回答

13

继续从您停止的地方开始,stackunstack的组合将为您提供所需的输出:

res = (
    df.groupby(['month', 'cat'])
    .sales.sum()
    .unstack(fill_value=0)  # Unstack and fill value for the null column
    .stack()  # Return to groupby form and reset
    .reset_index(name='sales')
)
< p > < code > res 的输出:

>>> res

  month cat sales
0   dec a   11
1   dec b   2
2   feb a   12
3   feb b   4
4   jan a   0
5   jan b   5
6   mar a   0
7   mar b   4

您还可以使用分类变量,并将observed设置为False;这将确保在最终输出中呈现所有可能的组合。

(df.astype({'month' : 'category',
            'cat' : 'category'})
   .groupby(['month', 'cat'], 
             as_index = False, 
             observed = False)
   .sum(numeric_only = True)
)

  month cat  sales
0   dec   a     11
1   dec   b      2
2   feb   a     12
3   feb   b      4
4   jan   a      0
5   jan   b      5
6   mar   a      0
7   mar   b      4

7

使用MultiIndex结合reindex,示例如下:

df=(
    df.groupby(['month','cat']).sales.sum()
    .reindex(pd.MultiIndex.from_product([df.month.unique(), df.cat.unique()], 
                                   names=['month', 'cat']), fill_value=0)
    .reset_index()
)

print(df)
  month cat  sales
0   dec   a     11
1   dec   b      2
2   feb   a     12
3   feb   b      4
4   jan   a      0
5   jan   b      5
6   mar   a      0
7   mar   b      4

好的解决方案,我认为可能比上面的其他方案更具可扩展性。建议进行编辑,因为使用我的虚拟代码时,from_tuples(np.product....)实际上并没有起作用,因为它们是非数字的。或者至少这是我得到的错误。假设也使用了np.product。 - born_naked
@born_naked 这里使用的是 itertools 中的 product,而不是 numpy。请确认使用的是 itertools 的 product。 - Space Impact

4

另一种方法不使用groupby,而是使用pivot_tablestack

df_ = df.pivot_table(index='month',columns='cat', 
                     values='sales', aggfunc=sum, fill_value=0)\
        .stack().reset_index()
print (df_)
  month cat   0
0   dec   a  11
1   dec   b   2
2   feb   a  12
3   feb   b   4
4   jan   a   0
5   jan   b   5
6   mar   a   0
7   mar   b   4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接