如何解决Python对DataFrame指定列分词时的float类型TypeError?
问题解决:分词时出现
TypeError: expected string or bytes-like object, got 'float' 问题根源
- 文件读取方式错误:你用
pd.read_csv()读取.xlsx格式的Excel文件,这会导致数据读取异常,应改用pd.read_excel()。 - 列中存在缺失值:
CD列里的缺失值以float类型的NaN存在,而RegexpTokenizer.tokenize()仅支持处理字符串类型,因此触发类型错误。
解决方案
步骤1:修正文件读取逻辑
先把读取代码改为正确的Excel读取方法:
import pandas as pd from nltk.tokenize import RegexpTokenizer # 修正读取方式 df = pd.read_excel(r"D:\......PATH\sample_regex.xlsx")
步骤2:处理列中的非字符串值
以下三种方式任选其一即可:
方式一:将整列转为字符串处理
把CD列所有值统一转为字符串,再执行分词,缺失值会被转为'nan',可进一步处理为空列表:
regexp = RegexpTokenizer('\w+') # 转字符串后分词 df['CDnew'] = df['CD'].astype(str).apply(regexp.tokenize) # 将'nan'对应的分词结果转为空列表 df['CDnew'] = df['CDnew'].apply(lambda x: [] if x == ['nan'] else x)
方式二:填充缺失值后分词
用空字符串或自定义占位符填充缺失值,再执行分词:
regexp = RegexpTokenizer('\w+') # 用空字符串填充缺失值 df['CD'] = df['CD'].fillna('') df['CDnew'] = df['CD'].apply(regexp.tokenize)
方式三:在分词函数中加入类型判断
仅对字符串类型的值执行分词,非字符串类型直接返回空列表:
regexp = RegexpTokenizer('\w+') def tokenize_text(text): if isinstance(text, str): return regexp.tokenize(text) return [] df['CDnew'] = df['CD'].apply(tokenize_text)
验证处理结果
可以用以下代码确认处理效果:
# 查看CD列数据类型和缺失值数量 print("CD列数据类型:", df['CD'].dtype) print("CD列缺失值数量:", df['CD'].isna().sum()) # 查看分词结果示例 print(df[['CD', 'CDnew']].head())
内容的提问来源于stack exchange,提问作者Sanky Ach
相关产品推荐
相关产品推荐

