python - 多个 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'] 时,出现尺寸不匹配错误。
先感谢您。
解决方案
您可以尝试聚合 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
推荐阅读
- python - 重命名或替换文件夹中的文件
- huawei-mobile-services - 如果我的测试用户无法收到我的公开测试邀请,我该怎么办
- sql - 如何找到数据库大小的细分以识别高空间消费者 - postgresql
- android - `Telephony.Mms` 中的 `Telephony.Sms.TYPE` 等价物是什么?
- python - 如何在python中将INT(track_no:1)中的字典转换为String(track_no:'1')
- reactjs - 我如何重定向在 reactjs 中提交表单并使用 formik
- python - 在 python opencv 中实现 Robert 的边缘算子进行边缘检测
- firebase - 使用 eventId 作为 Firestore 文档 ID 总是安全的吗?
- wordpress - 如何在 wordpress 中启用修订
- c++ - 为什么成员函数与局部函数不同地传递给 std::thread?