如何解决递归更新Pandas DataFrame拼接连字符单词时无法安全退出的问题
问题原因分析
- 核心bug1:链式索引赋值失效:原代码中
newdf.iloc[index]['author_ex'] = fixed_token属于链式索引操作,Pandas会返回数据副本而非原DataFrame的视图,导致修改没有真正写入newdf。每次处理完带连字符的行后,该行依然保留末尾连字符,递归会无限重复处理同一行,自然无法正常退出。 - 次要问题:flag变量初始化放在循环内部逻辑冗余,且递归实现的效率极低,数据量稍大就会触发性能问题甚至递归深度溢出。
修复方案
方法1:最小改动适配原有递归逻辑
仅修改赋值写法为规范的位置索引写法,其他逻辑保持不变即可正常运行:
def rm_actual(datafe, index): stem1 = datafe.iloc[index]['author_ex'] stem2 = datafe.iloc[index + 1]['author_ex'] fixed_token = stem1[:-1] + stem2 datafe.drop(index=index + 1, inplace=True, axis=0) newdf=datafe.reset_index(drop=True) # 修复:替换链式索引为官方推荐的赋值写法 newdf.loc[index, 'author_ex'] = fixed_token return newdf def remove_hyphens(datafe): # 将flag初始化移到循环外,逻辑更清晰 flag = False for index, row in datafe.iterrows(): token=row['author_ex'] if token.endswith('-'): datafe=rm_actual(datafe, index) flag=True break if flag==True: datafe=remove_hyphens(datafe) else: return datafe datafe=remove_hyphens(datafe) print(datafe)
方法2:更高效的非递归实现(推荐)
完全避免递归,一次遍历即可处理所有拼接需求,性能更稳定,也不会出现递归退出问题:
import pandas as pd def remove_hyphens_iter(df): res_list = [] skip_next_row = False for i in range(len(df)): if skip_next_row: skip_next_row = False continue current_str = df.loc[i, 'author_ex'] # 匹配末尾连字符且存在下一行的场景 if current_str.endswith('-') and i < len(df)-1: next_str = df.loc[i+1, 'author_ex'] res_list.append(current_str[:-1] + next_str) skip_next_row = True else: res_list.append(current_str) return pd.DataFrame({'author_ex': res_list}) # 调用示例 datafe = remove_hyphens_iter(datafe) print(datafe)
两种方法运行后都能输出你给出的预期结果。
内容的提问来源于stack exchange,提问作者Pert8S
相关产品推荐
相关产品推荐

