pandas搭配lambda函数统计唯一投资者数时触发TypeError报错
pandas统计不重复投资者数量时报类型错误的解决方案
触发场景
在pandas数据处理流程中,为统一投资者名称格式(将大写字母转为小写,避免因大小写差异被误判为不同主体)、统计不重复投资者总数,执行如下代码时出现异常:un=len(data["investor"].apply(lambda x:x.lower()).unique())
程序抛出类型错误,报错信息为TypeError: can only concatenate str (not "int") to str,无法输出预期的统计结果。
报错根因
原代码默认data["investor"]列的所有元素均为字符串类型,但实际该列混杂了整数、浮点数等非字符串类型的数值数据。当逐元素执行字符串小写转换逻辑时,pandas底层处理字符串方法的过程中触发字符串与非字符串数值的类型不兼容操作,最终抛出拼接类的类型错误。
可执行修正方案
- 方案1:在转换逻辑中增加类型判断,仅对字符串类型的元素执行小写转换,适配列内混杂多类型值的场景,修改后代码为:
un=len(data["investor"].dropna().apply(lambda x: x.lower() if isinstance(x, str) else x).unique())
该逻辑会跳过非字符串值的小写转换步骤,避免类型错误,同时保留所有有效记录参与去重统计。 - 方案2:先强制将整列转换为字符串格式,再统一执行小写归一化,适合需要对所有值做字符串格式统一的场景,修改后代码为:
un=len(data["investor"].dropna().astype(str).str.lower().unique())
注意:该转换逻辑会自动将列内的整数、空值转为对应字符串形式(如整数123会转为"123",空值转为"nan"),如果需要排除空值的统计干扰,可通过dropna()提前过滤无效记录。 - 方案3:使用pandas内置的去重计数能力替代手动去重逻辑,运行效率更高、容错性更强,修改后代码为:
不需要做格式归一化的场景直接计数:un = data["investor"].dropna().nunique()
需要统一小写格式再计数的场景:un = data["investor"].dropna().astype(str).str.lower().nunique()
内容的提问来源于stack exchange,提问作者masete
相关产品推荐
相关产品推荐

