通过文本变量匹配DataFrame生成CSV时行数异常问题求助
问题分析与解决
你的代码出现csv行数远超文本文件行数的原因有两个核心问题:
- 判断逻辑错误:
if sn in df[df['SERIAL'].str.contains(sn)]是检查DataFrame的列名是否包含sn,而非检查是否存在匹配的行,导致每次循环都会执行追加操作,完全起不到过滤作用。 - 重复写入:循环中每次匹配到行就追加到csv,若某行的SERIAL能被多个sn匹配到(比如SERIAL为
SN123,sn列表里有SN和123),这行会被多次写入,最终导致csv行数暴增。
解决方案
方法一:一次性批量匹配(推荐,效率更高)
直接用正则表达式拼接所有sn,一次性筛选出所有匹配的行,避免循环重复写入:
import pandas as pd import re # 1. 读取并处理文本文件的sn列表(去掉换行和空行) with open('你的文本文件路径.txt', 'r') as f: sn_list = [line.strip() for line in f if line.strip()] # 2. 拼接sn为正则表达式,转义特殊字符防止匹配出错 sn_pattern = '|'.join([re.escape(sn) for sn in sn_list]) # 3. 筛选所有SERIAL包含任意sn的行,na=False排除空值行 matched_df = df[df['SERIAL'].str.contains(sn_pattern, na=False)] # 4. 一次性写入csv,避免重复追加 matched_df.to_csv('try.csv', sep=',', index=False)
方法二:循环收集后去重写入
如果需要保留循环逻辑,可先收集所有匹配行,再去重后写入:
import pandas as pd import re with open('你的文本文件路径.txt', 'r') as f: sn_list = [line.strip() for line in f if line.strip()] matched_rows = [] for sn in sn_list: # 筛选匹配当前sn的行,转义特殊字符 current_matches = df[df['SERIAL'].str.contains(re.escape(sn), na=False)] matched_rows.append(current_matches) # 合并所有匹配行并去重 final_df = pd.concat(matched_rows).drop_duplicates() final_df.to_csv('try.csv', sep=',', index=False)
额外优化点
- 如果你的sn是完全匹配而非包含匹配,把
str.contains换成isin效率更高:matched_df = df[df['SERIAL'].isin(sn_list)] - 若原DataFrame本身存在重复行,可在写入前用
drop_duplicates()去重。
内容的提问来源于stack exchange,提问作者ptr808
相关产品推荐
相关产品推荐

