使用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
相关产品推荐
相关产品推荐

