首页 > 解决方案 > 多个 groupby 并获得唯一计数

问题描述

我有以下df1:

id period color size rate
1    01    red   12   30
1    02    red   12   30
2    01    blue  12   35
3    03    blue  12   35
4    01    blue  12   35
4    02    blue  12   35
5    01    pink  10   40
6    01    pink  10   40

我需要创建一个基本上是一组颜色大小比率的索引列,并计算具有这种组合的唯一 ID 的数量。转换后我的输出 df 应如下所示 df1:

id period color size rate      index     count
1    01    red   12   30    red-12-30     1
1    02    red   12   30    red-12-30     1
2    01    blue  12   35    blue-12-35    3
2    03    blue  12   35    blue-12-35    3
4    01    blue  12   35    blue-12-35    3
4    02    blue  12   35    blue-12-35    3
5    01    pink  10   40    pink-10-40    2
6    01    pink  10   40    pink-10-40    2

我能够得到计数,但它不计算“唯一”ID,而是计算出现次数。

1    01    red   12   30    red-12-30     2
1    02    red   12   30    red-12-30     2
2    01    blue  12   35    blue-12-35    4
2    03    blue  12   35    blue-12-35    4
4    01    blue  12   35    blue-12-35    4
4    02    blue  12   35    blue-12-35    4

这是错误的,因为它实际上并没有按 id 分组来计算唯一的。

欣赏这个方向的任何指针。

随着我的要求发生变化,在此处添加编辑:计数还需要按“句点”分组,即我的最终 df 应该是:

index       period   count
red-12-30    01        1
red-12-30    02        1
blue-12-35   01        2
blue-12-35   03        1
blue-12-35   02        1
pink-10-40   01        2

解决方案:来自@anky:当我尝试添加另一个 groupby['period'] 时,出现尺寸不匹配错误。

先感谢您。

标签: pythonpandaspandas-groupby

解决方案


您可以尝试聚合 ajoin以创建索引列,然后对其进行分组并开始nunique使用groupby+transform

idx = df[['color','size','rate']].astype(str).agg('-'.join,1)
out = df.assign(index=idx,count=df.groupby(idx)['id'].transform('nunique'))

print(out)

   id  period color  size  rate       index  count
0   1       1   red    12    30   red-12-30      1
1   1       2   red    12    30   red-12-30      1
2   2       1  blue    12    35  blue-12-35      3
3   3       3  blue    12    35  blue-12-35      3
4   4       1  blue    12    35  blue-12-35      3
5   4       2  blue    12    35  blue-12-35      3
6   5       1  pink    10    40  pink-10-40      2
7   6       1  pink    10    40  pink-10-40      2

推荐阅读