【问题标题】:multiple groupby and get unique count多个 groupby 并获得唯一计数
【发布时间】:2020-11-11 01:51:58
【问题描述】:

我有以下 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'] 时,出现维度不匹配错误。

提前谢谢你。

【问题讨论】:

  • 是的,现在编辑,谢谢@anky

标签: python pandas pandas-groupby


【解决方案1】:

您可以尝试聚合 join 来创建索引列,然后在同一列上进行分组并使用 groupby+transform 获取 nunique

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

【讨论】:

  • 嗨 anky,我刚刚编辑了 OP 以包含我想要做的事情。我需要添加另一个 groupby ['period']。关于我可以尝试的任何建议?谢谢。
  • @savi 我认为您正在寻找 df.groupby([idx,'period'],sort=False)['id'].nunique().reset_index(name='count') 或者如果您可以取消索引,这很简单 df.groupby(['color','size','rate','period'])['id'].nunique().reset_index()
  • 不,我需要索引列,因为我接下来要创建一个 pivot_table,然后是一个热图
猜你喜欢
  • 1970-01-01
  • 2023-01-23
  • 2021-10-18
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2019-08-31
  • 1970-01-01
相关资源
最近更新 更多