Python pandas分组拼接组内非空去重字符串报错求解
报错原因
你之前的代码触发类型错误的核心原因是:pandas 中的空值NaN属于float类型,直接调用', '.join时会把组内的空值一并传入,而字符串join方法要求所有待拼接元素必须是字符串类型,因此抛出类型错误。同时原写法没有做去重处理,即便解决空值问题,也会得到带重复值的拼接结果,不符合预期。
正确实现代码
你可以在分组聚合的逻辑里依次完成空值过滤、去重、拼接三个步骤,代码如下:
import pandas as pd import numpy as np # 原始测试数据 df = pd.DataFrame({'Material': [1,1,1,2,2,2,3,3,3,3], 'BOM': ['A','B',np.nan,'A',np.nan,'C','A','A','B','C']}) # 分组聚合实现需求 result = df.groupby('Material')['BOM'].agg( lambda x: ', '.join(x.dropna().unique()) ).reset_index()
执行后打印result即可得到目标结果:
Material BOM 0 1 A, B 1 2 A, C 2 3 A, B, C
逻辑说明
聚合函数里的处理步骤完全匹配需求:
x.dropna():剔除当前分组内BOM列的所有空值,从根源解决类型报错问题.unique():对非空的BOM值去重,避免拼接出重复内容', '.join():将处理完成的字符串序列按要求拼接成指定格式
如果数据量较大,也可以先全局过滤BOM列的空值再分组,减少分组阶段的计算量,写法等价:
result = df.dropna(subset=['BOM']).groupby('Material')['BOM'].agg( lambda x: ', '.join(x.unique()) ).reset_index()
内容的提问来源于stack exchange,提问作者Jefferson Robinski
相关产品推荐
相关产品推荐

