如何在Pandas链式调用中使用groupby+ngroup生成分组ID?
用Pandas链式调用生成分组ID的正确方法
嘿,我来帮你搞定这个链式调用的问题!你之前尝试用agg结合NamedAgg的方式行不通,主要有两个核心原因:
ngroup()是Pandas分组对象的行级方法,用来给每一行分配对应的分组ID,不属于针对某列的聚合函数,所以没法用agg来调用它;pd.NamedAgg的column参数只能接收单个列名,不能传入列名列表,这也是代码报错的直接原因。
正确的链式实现方式
我们可以用assign方法结合匿名函数来实现链式调用,完美替代常规的分组赋值写法:
import pandas as pd df = pd.DataFrame({'a':[1,1,1,2,2,2],'b':[1,1,2,1,1,2]}) # 链式调用生成分组ID df = df.assign(newID=lambda x: x.groupby(['a', 'b']).ngroup())
运行后df的结果如下:
| a | b | newID | |
|---|---|---|---|
| 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 0 |
| 2 | 1 | 2 | 1 |
| 3 | 2 | 1 | 2 |
| 4 | 2 | 1 | 2 |
| 5 | 2 | 2 | 3 |
如果你更倾向于用pipe方法来实现链式调用,也可以这么写:
df = df.pipe(lambda df: df.assign(newID=df.groupby(['a', 'b']).ngroup()))
原理说明
assign方法允许我们在DataFrame上直接新增列,并且可以通过匿名函数lambda x引用当前的DataFrame对象;- 匿名函数里的
x.groupby(['a', 'b']).ngroup()和你常规写法里的逻辑完全一致,会根据a和b的组合生成唯一的分组ID,顺序是按分组的出现顺序排列的。
内容的提问来源于stack exchange,提问作者safex
相关产品推荐
相关产品推荐

