pandas对部分DataFrame列应用标点移除函数时报错问题咨询
问题根因
这个报错和command的列名没有任何关系。你的remove_punctuations函数默认接收字符串输入,但command列里混了非字符串类型的值——最常见的就是NaN空值、数值、None,这类值没有字符串自带的.replace()方法,调用时就会抛属性错误。前面三列能跑通,纯粹是因为这三列刚好全是字符串值而已。
异常排查
执行以下代码可以直接定位command列里的非字符串异常值:
# 查看列的整体数据类型 print(dataset['command'].dtype) # 筛选出所有值不是字符串类型的行 print(dataset[~dataset['command'].apply(lambda x: isinstance(x, str))])
修复方案
给自定义函数增加类型判断逻辑,遇到非字符串值直接原样返回即可,不需要修改原有调用逻辑,也可以批量处理多列减少重复代码:
import string def remove_punctuations(text): # 非字符串值直接返回,避免调用字符串方法报错 if not isinstance(text, str): return text for punctuation in string.punctuation: text = text.replace(punctuation, '') return text # 批量处理所有目标列,不用逐列写重复代码 target_columns = ['Info', 'Message', 'Target', 'command'] for col in target_columns: dataset[col] = dataset[col].apply(remove_punctuations)
如果你不需要保留列内的原始空值/非字符串值,也可以在处理前先把整列统一转为字符串类型,写法更简洁:
dataset['command'] = dataset['command'].astype(str).apply(remove_punctuations)
注意:这种写法会把
NaN空值转为字符串"nan",如果后续有空值统计、填充类的处理需求,优先选择加类型判断的方案,避免原始空值被污染。

内容的提问来源于stack exchange,提问作者Salman Khan
相关产品推荐
相关产品推荐

