Pandas groupby聚合字符串列报TypeError如何解决
错误原因
这个报错的触发逻辑非常直接:str.join()方法仅支持拼接字符串类型的元素,你传入的待拼接序列里存在float类型的值,就会抛出这个类型错误。
具体到你的代码场景,90%以上的概率是Initial 列存在空值NaN——pandas中空值NaN的默认类型就是float,哪怕这列其他内容全是字符串,只要混了NaN,x.unique()取到的唯一值序列里就会带float类型的NaN,传入'/'.join()时直接触发报错。剩余小概率情况是Initial 列本身就混合存储了字符串、浮点数值两类数据,没有做类型统一。
另外提醒一句:你代码里写的列名Type 、Initial 尾部都带了空格,要先确认原始DataFrame的列名确实带这个尾部空格,避免后续触发列不存在的报错。
修复方案
核心修改思路是在拼接前统一处理值的类型、过滤掉会导致类型错误的空值,推荐两种可直接用的写法:
方案1:直接修改聚合逻辑里的lambda函数,不需要提前处理原表,兼容性最好
把原来聚合Initial列的lambda逻辑替换为带空值过滤、类型转换的版本即可:dfz = dfy.groupby('Type ').agg({ 'Initial ': lambda x: '/'.join(str(item) for item in x.dropna().unique()), 2021: 'sum', 2022: 'sum' }).reset_index()逻辑说明:
x.dropna()先剔除分组内该列的空值,遍历剩余唯一值时统一转成字符串再拼接,不管列里混了什么类型的非空值,都不会触发join的类型错误。方案2:如果确定列里除了空值没有其他非字符串内容,也可以提前填充空值再走原逻辑
# 先把Initial列的空值替换为空字符串,消除float类型的NaN dfy['Initial '] = dfy['Initial '].fillna('') # 再执行原分组聚合逻辑 dfz = dfy.groupby('Type ').agg({ 'Initial ': lambda x: '/'.join(x.unique()), 2021: 'sum', 2022: 'sum' }).reset_index()
内容的提问来源于stack exchange,提问作者Mr Mann
相关产品推荐
相关产品推荐

