DataFrame使用apply(len)报错float无len(),同类型name列正常求排查
问题原因与解决方案
你遇到的这个问题其实挺常见的——虽然item_description列的类型显示是object,但它里面混进了float类型的NaN缺失值,这就是触发TypeError: object of type 'float' has no len()的核心原因。
为什么name列能正常执行?
name列没报错,大概率是因为它里面没有缺失值(NaN),所有元素都是标准的字符串类型,自然可以直接用len()计算长度。而item_description列存在缺失时,pandas会默认用float类型的NaN来填充这些空位,这就导致列的整体类型还是object,但内部元素同时包含字符串和float两种类型,当apply(len)遍历到NaN时,自然就会报错。
验证猜测的方法
你可以先跑下面的代码确认一下:
# 查看item_description列里的所有元素类型 print(df['item_description'].apply(type).unique()) # 统计缺失值的数量 print(df['item_description'].isna().sum())
如果输出里有<class 'float'>,且缺失值数量大于0,就坐实了这个原因。
解决办法
有两种简单的处理方式:
- 方式一:用空字符串填充缺失值
把NaN替换成空字符串,这样计算长度时会返回0,不会报错:df['desc_len'] = df['item_description'].fillna('').apply(len) - 方式二:用lambda表达式判断处理
直接在apply里判断元素是否为NaN,是则返回你想要的默认值(比如0),否则计算长度:import pandas as pd df['desc_len'] = df['item_description'].apply(lambda x: len(x) if pd.notna(x) else 0)
内容的提问来源于stack exchange,提问作者Jaskaran Singh Puri
相关产品推荐
相关产品推荐

