Pandas如何替换以特定字符开头的字符串?map返回全NaN如何解决
你代码运行返回全NaN的核心原因是对Series.map()的传参逻辑使用错误:当传入字典作为map的参数时,Pandas会将Series的每个元素值与字典的键做等值匹配,你将lambda函数作为字典的键,字符串元素不可能和函数对象匹配成功,因此所有结果都为NaN。
解决方案1:直接传入匹配函数
map支持直接传入自定义函数处理每个元素,写法如下:
import numpy as np import pandas as pd s = pd.Series(['cat', 'dog', np.nan, 'rabbit']) def match_prefix(x): # 先处理空值避免调用startswith报错 if pd.isna(x): return np.nan if x.startswith('c'): return 'kitten' elif x.startswith('d'): return 'puppy' elif x.startswith('r'): return 'bunny' # 未匹配到也返回空值 return np.nan result = s.map(match_prefix) print(result)
运行后输出和你期望的结果完全一致:
0 kitten 1 puppy 2 NaN 3 bunny dtype: object
解决方案2:规则可扩展写法
如果后续要新增匹配规则,可将前缀和对应值存入字典,避免写大量if-elif:
prefix_map = { 'c': 'kitten', 'd': 'puppy', 'r': 'bunny' } def match_prefix(x): if pd.isna(x): return np.nan for prefix, target in prefix_map.items(): if x.startswith(prefix): return target return np.nan result = s.map(match_prefix)
内容的提问来源于stack exchange,提问作者S23
相关产品推荐
相关产品推荐

