自定义函数应用于Pandas DataFrame列不生效,如何排查解决?
问题定位与修复方案
核心错误(无修改效果的直接原因)
你的自定义函数逻辑中,已经生成了处理完成的words_tc列表,但最终返回的是未经修改的原始words列表,所有处理逻辑都没有实际生效,这是运行后列内容无变化的直接原因。
其他隐藏问题
- 你提前将整个Technology列转成了str类型,原本的空值NaN会被转为字符串
'nan',无法被正常识别为空值处理。 - 直接用原始大小写的单词判断是否属于缩写集合,若输入内容出现大小写混合的情况(比如
hp、At&T),会无法匹配到预设缩写,导致被错误转成Title格式。 - 没有做空值判断,空值调用split方法会抛出异常(你提前转str掩盖了这个问题,但会引入无效的
'nan'字符串)。
修复后代码
import pandas as pd import numpy as np # 构造测试数据 data = [['HP', 10], ['GORDON', 15], ['AT&T', 14], [np.nan, 9], ['SAPORI TRATTORIA', 8]] db = pd.DataFrame(data, columns = ['Technology', 'Age']) # 预设缩写集合 acronyms = {'HP', 'GE', 'TBD', 'AT&T'} # 统一转大写做匹配基准,避免大小写问题导致匹配失败 acronyms_upper = {acr.upper() for acr in acronyms} def title_case_not_acronyms(orig_str): # 空值直接返回不处理 if pd.isna(orig_str): return orig_str words = orig_str.split(" ") words_tc = [word if word.upper() in acronyms_upper else word.title() for word in words] # 返回处理后的列表拼接结果 return " ".join(words_tc) # 不提前转str,函数内自行处理空值 db['Technology'] = db['Technology'].apply(title_case_not_acronyms)
处理效果验证
| 原始输入 | 处理后输出 |
|---|---|
| HP | HP |
| GORDON | Gordon |
| AT&T | AT&T |
| NaN | NaN |
| SAPORI TRATTORIA | Sapori Trattoria |
内容的提问来源于stack exchange,提问作者RCarmody
相关产品推荐
相关产品推荐

