pandas groupby调用ngroup()返回大量-1值的原因排查
产生问题的核心原因
你遇到的问题来自代码误用和pandas默认机制的共同作用:
- 第一处错误是方法/属性混淆:你代码里写的
.ngroups()是错误调用。ngroups是GroupBy对象的属性,不是可调用的方法,它仅返回一个代表总分组数的固定整数,完全无法实现逐行匹配分组编号的效果。你需要调用的是ngroup()方法(注意方法名少一个s),这才是官方文档中描述的、给每个分组从0到总分组数-1逐行打编号的接口。 - 第二处-1值的来源是pandas groupby的默认规则:groupby默认会自动丢弃所有分组键列中存在空值(NaN、NaT等空类型)的行,这些行不会被归入任何有效分组,在
ngroup()的返回结果中,这类无有效分组的行就会被标记为-1。
修正方案
根据你的需求选择对应写法即可:
granularity = [ "domain", "channel", "app_id", "section_id", "country_id", ] # 写法1:匹配官方文档默认逻辑,分组键为空的行返回-1 df["id"] = df.groupby(granularity).ngroup() # 写法2:将分组键为空的组合也作为独立分组参与编号,不会返回-1(pandas 1.1.0及以上版本支持) df["id"] = df.groupby(granularity, dropna=False).ngroup()
补充说明:
ngroup()返回的编号顺序和groupby的分组迭代顺序完全一致,编号连续不重复,仅被排除在分组外的空值行会返回-1,不存在其他返回-1的场景。
内容的提问来源于stack exchange,提问作者OscarTheBest
相关产品推荐
相关产品推荐

