使用string_grouper遇TypeError:输入非纯字符串pandas.Series
解决string_grouper的TypeError问题:输入需为仅含字符串的pandas Series
问题场景
我正在使用string_grouper库的string_matching模块,根据客户个人数据查找可能的重复项,代码如下:
base1=pd.DataFrame(base[['Cliente','registro']]) matches = match_strings(base1['registro'], master_id =base1['Cliente'],ignore_index=True, min_similarity = 0.5,regex=r"[,-./]|\s", tfidf_matrix_dtype=np.float32)
运行时抛出如下错误:
TypeError Traceback (most recent call last) C:\Users\MXROBL~1\AppData\Local\Temp/ipykernel_1952/2333918413.py in <module> 2 3 # Create all matches: ----> 4 matches = match_strings(base1['registro'], master_id =base1['Cliente'],ignore_index=True, min_similarity = 0.5,regex=r"[,-./]|\s", tfidf_matrix_dtype=np.float32) ~\Anaconda3\lib\site-packages\string_grouper\string_grouper.py in match_strings(master, duplicates, **kwargs) 67 :return: pandas.Dataframe 68 """ ---> 69 string_grouper = StringGrouper(master, duplicates=duplicates, **kwargs).fit() 70 return string_grouper.get_matches() 71 ~\Anaconda3\lib\site-packages\string_grouper\string_grouper.py in __init__(self, master, duplicates, **kwargs) 126 if not StringGrouper._is_series_of_strings(master) or \ 127 (duplicates is not None and not StringGrouper._is_series_of_strings(duplicates)): ---> 128 raise TypeError('Input does not consist of pandas.Series containing only Strings') 129 130 self._config: StringGrouperConfig = StringGrouperConfig(**kwargs) TypeError: Input does not consist of pandas.Series containing only Strings
错误原因
报错明确指出,match_strings要求输入的master(此处为base1['registro'])以及master_id对应的Series必须是仅包含字符串类型的pandas Series。你的输入中至少有一个Series存在非字符串类型的数据(比如数字、空值、混合类型等)。
解决步骤
检查数据类型与内容
先确认两个Series的数据类型,定位非字符串数据:# 查看各列数据类型 print(base1.dtypes) # 找出registro列中非字符串的行 print(base1[~base1['registro'].apply(lambda x: isinstance(x, str))]) # 找出Cliente列中非字符串的行 print(base1[~base1['Cliente'].apply(lambda x: isinstance(x, str))])强制转换为字符串并处理空值
将两个Series统一转换为字符串类型,同时替换转换后出现的"nan"字符串(避免原空值干扰匹配):base1['registro'] = base1['registro'].astype(str).replace('nan', '') base1['Cliente'] = base1['Cliente'].astype(str).replace('nan', '')过滤无效空字符串(可选)
如果转换后存在空字符串,可过滤掉这些行提升匹配质量:base1 = base1[(base1['registro'] != '') & (base1['Cliente'] != '')]重新执行匹配代码
完成上述处理后,再次运行原匹配逻辑即可:matches = match_strings(base1['registro'], master_id =base1['Cliente'],ignore_index=True, min_similarity = 0.5,regex=r"[,-./]|\s", tfidf_matrix_dtype=np.float32)
内容的提问来源于stack exchange,提问作者fernandaluqueno
相关产品推荐
相关产品推荐

