You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Pandas中按name与test_type分组统计block不同值计数并新增列

解决Pandas按多组分组后对唯一值顺序计数的问题

首先构造你提供的示例DataFrame:

import pandas as pd

data = {
    'name': ['joe', 'joe', 'joe', 'joe', 'joe', 'joe', 'jim', 'jim', 'jim', 'jim', 'jim', 'jim'],
    'test_type': [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1],
    'block': [1, 1, 2, 2, 3, 3, 1, 1, 2, 2, 3, 3]
}
df = pd.DataFrame(data)

要实现需求的block_by_test_type列,可以通过分组后使用factorize方法完成,代码如下:

df['block_by_test_type'] = df.groupby(['name', 'test_type'])['block'].transform(
    lambda x: x.factorize()[0] + 1
)

执行后得到的结果与你期望的一致:

name  test_type  block  block_by_test_type
0    joe          0      1                   1
1    joe          0      1                   1
2    joe          1      2                   1
3    joe          1      2                   1
4    joe          0      3                   2
5    joe          0      3                   2
6    jim          1      1                   1
7    jim          1      1                   1
8    jim          0      2                   1
9    jim          0      2                   1
10   jim          1      3                   2
11   jim          1      3                   2

代码解释

  1. groupby(['name', 'test_type']):按name和test_type双重分组,确保仅在同一用户、同一测试类型的范围内处理数据。
  2. ['block'].transform(...):对每个分组内的block列应用转换函数,同时保持结果与原DataFrame行数一致。
  3. lambda x: x.factorize()[0] + 1:
    • factorize()会将分组内的block唯一值按出现顺序映射为从0开始的连续整数,首次出现的新值对应0,下一个新值对应1,以此类推。
    • 加1是为了让计数从1开始,匹配你需要的格式。

如果之前用cumsum未成功,通常是因为没有先标记block的变化节点,而factorize直接针对唯一值的出现顺序编码,更适配这个场景。

内容的提问来源于stack exchange,提问作者gimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 05:57:30