在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
代码解释
groupby(['name', 'test_type']):按name和test_type双重分组,确保仅在同一用户、同一测试类型的范围内处理数据。['block'].transform(...):对每个分组内的block列应用转换函数,同时保持结果与原DataFrame行数一致。lambda x: x.factorize()[0] + 1:factorize()会将分组内的block唯一值按出现顺序映射为从0开始的连续整数,首次出现的新值对应0,下一个新值对应1,以此类推。- 加1是为了让计数从1开始,匹配你需要的格式。
如果之前用cumsum未成功,通常是因为没有先标记block的变化节点,而factorize直接针对唯一值的出现顺序编码,更适配这个场景。
内容的提问来源于stack exchange,提问作者gimi
相关产品推荐
相关产品推荐

