Pandas分组transform赋值报错:KeyError与ValueError问题排查
你遇到的问题是在给DataFrame添加size列(用来标记每个customer_id对应的分组大小)时,触发了KeyError和ValueError。你的DataFrame形状为(4899, 48),执行的代码如下:
a['size'] = a.groupby(['customer_id']).transform(np.size)
错误原因分析
报错里的ValueError: Wrong number of items passed 47, placement implies 1是核心问题:当你直接对分组后的整个DataFrame调用transform(np.size)时,Pandas会对每一列单独执行np.size函数,最终返回一个包含47列的DataFrame。而你试图把这个多列结果赋值给单列a['size'],维度不匹配就触发了这个错误。中间出现的KeyError: 'size'是赋值过程中Pandas找不到目标列时的中间异常,根源还是返回结果的维度不对。
解决方案
要正确获取每个customer_id的分组大小并赋值给单列,这里有几个简单可行的方法:
指定单列计算分组大小(推荐)
选择任意一列(比如直接用customer_id列),对该列应用transform,这样会返回一个单列的Series,刚好匹配你要添加的size列:a['size'] = a.groupby('customer_id')['customer_id'].transform('size')使用
len函数替代np.sizelen作用在分组对象上时,会直接返回分组的行数,结合transform就能得到每行对应的分组大小:a['size'] = a.groupby('customer_id').transform(lambda x: len(x))用
np.size但指定轴参数
如果你一定要用np.size,需要指定axis=0来计算分组的行数(而非总元素数),同时确保只针对单列操作:a['size'] = a.groupby('customer_id')['customer_id'].transform(lambda x: np.size(x, axis=0))
执行上述任意一种方法后,a['size']列的每个值都会对应该行customer_id在DataFrame中出现的总次数,且不会再触发维度不匹配的错误。
内容的提问来源于stack exchange,提问作者Nabih Bawazir

