Pandas多DataFrame列表多字符串原地替换避免生成额外行
问题原因
原有代码产生冗余行的核心问题是列表推导嵌套逻辑错误:
- 两层循环顺序写反:
for val in x for ext_t, cln_t in zip(int_text, clean_text)会对每个单元格值遍历所有替换规则,1个原始值会生成和替换规则数量相等的输出,导致每行元素数量翻倍,pandas自动将多余元素拆分为新行,产生冗余条目。 - 替换逻辑没有做结果收敛,没有保证每个原始单元格值最终只输出1个结果,同时临时zip遍历容易出现匹配词和替换内容错位的问题。
正确实现代码
首先构建固定的替换映射,保证匹配词和替换内容一一对应,推荐用pandas原生正则替换实现,代码简洁性能更高:
import pandas as pd import re from scipy import linalg # 原有初始化逻辑不变 nm=['sr', 'pop15', 'pop75', 'dpi', 'ddpi'] df_tbl=pd.DataFrame(linalg.circulant(nm)) ls_comb = [df_tbl.loc[0:i] for i in range(0, len(df_tbl))] extract_text=['dpi', 'pop15'] clean_text=['np.log(dpi)', 'np.log(pop15)'] cl_text=[re.search('(?<=\\()[^\\^\\)]+', i).group(0) for i in clean_text] int_text=list(set(extract_text).intersection(cl_text)) # 构建稳定替换映射,仅保留交集内的有效替换规则 replace_map = {} for ext_t, cln_t in zip(extract_text, clean_text): if ext_t in int_text: # key加单词边界正则,保证全词匹配 replace_map[rf"\b{ext_t}\b"] = cln_t # 批量正则替换,直接得到无冗余的结果 result = [df.replace(replace_map, regex=True) for df in ls_comb]
结果验证
运行后输出的前两个DataFrame完全符合预期:
- 第一个元素(仅1行):
0 1 2 3 4 0 sr ddpi np.log(dpi) pop75 np.log(pop15)
- 第二个元素(共2行):
0 1 2 3 4 0 sr ddpi np.log(dpi) pop75 np.log(pop15) 1 np.log(pop15) sr ddpi pop75 dpi
没有多余行,所有匹配dpi、pop15的全词匹配项都被正确替换为对应的np.log()格式内容。
如果需要原地修改原列表里的DataFrame,不需要生成新列表的话,直接循环遍历
ls_comb执行df.replace(replace_map, regex=True, inplace=True)即可。
内容的提问来源于stack exchange,提问作者joe_bill.dollar
相关产品推荐
相关产品推荐

