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

使用Pandas的groupby时列名存在却触发KeyError问题

解决pandas分组后访问列触发KeyError的问题

问题原因

当你执行grouped=df.groupby('Mail')[['NAME','ID']].apply(list)时,pandas会把每个分组内的NAME和ID列合并成一个包含两个列表的单一元素,而非保留NAME和ID作为独立列。执行reset_index()后,新DataFrame的列名是Mail和0,根本不存在ID列,所以访问grouped['ID']会触发KeyError。

而仅保留ID列时,groupby('Mail')['ID'].apply(list)会直接生成以ID为列名的结果,因此能正常运行。

解决方案

根据你的需求(展示Mail、NAME、ID列表及唯一ID计数),分两种场景给出实现代码:

场景1:每个邮箱对应唯一NAME

如果同一Mail对应的NAME不会重复,用agg分别聚合各字段:

# 聚合:NAME取唯一值/第一个值,ID转列表,计算唯一ID数量
grouped = df.groupby('Mail').agg(
    NAME=('NAME', 'first'),  # 若NAME可能重复,改用'unique'
    ID_LIST=('ID', list),
    COUNT=('ID', lambda x: len(set(x)))
).reset_index()

# 筛选唯一ID数量大于1的记录
result = grouped[grouped['COUNT'] > 1]

场景2:每个邮箱对应多个NAME

若同一Mail有多个NAME需要保留,同样用agg聚合:

grouped = df.groupby('Mail').agg(
    NAME_LIST=('NAME', list),
    ID_LIST=('ID', list),
    COUNT=('ID', lambda x: len(set(x)))
).reset_index()

result = grouped[grouped['COUNT'] > 1]

高效优化版

直接用pandas内置的nunique()计算唯一ID数量,避免转列表再去重,效率更高:

grouped = df.groupby('Mail').agg(
    NAME=('NAME', 'first'),
    ID_LIST=('ID', list),
    COUNT=('ID', 'nunique')
).reset_index()

result = grouped[grouped['COUNT'] > 1]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:12:51