pandas DataFrame按id分组统计name列唯一值数量结果不一致问题
不一致原因
- 执行完第一次分组聚合代码后,你得到的新
df仅包含id、unique两列,原始name列已经被聚合掉不存在了。如果你的代码没有触发KeyError: 'name'报错,说明你后续执行nunique()统计时调用的是未做第一次分组的原始表,统计的是原始表中每个id的name唯一值,而非第一次分组后的结果。 - 如果你是误对
unique列执行nunique()统计:pandas的nunique()会把列中的每个元素当作单独个体计数,而unique列的每个元素是存了多个值的数组,单个数组会被识别为一个唯一值,最终得到的结果都是1,自然和数组内部的元素长度不符。
解决方法
你不需要分两次分组操作,一次分组聚合即可直接得到预期结果:
result = df.groupby('id', as_index=False)['name'].agg( unique = lambda x: x.unique().tolist(), count = 'nunique' )
如果已经生成了带unique列的分组结果,直接计算unique列每个元素的长度即可得到计数:
# 沿用你已有的分组代码 df = df.groupby('id')['name'].agg(['unique']).reset_index() # 新增count列 df['count'] = df['unique'].apply(len)
内容的提问来源于stack exchange,提问作者user3447653
相关产品推荐
相关产品推荐

