You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过文本变量匹配DataFrame生成CSV时行数异常问题求助

问题分析与解决

你的代码出现csv行数远超文本文件行数的原因有两个核心问题:

  1. 判断逻辑错误:if sn in df[df['SERIAL'].str.contains(sn)] 是检查DataFrame的列名是否包含sn,而非检查是否存在匹配的行,导致每次循环都会执行追加操作,完全起不到过滤作用。
  2. 重复写入:循环中每次匹配到行就追加到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:50:39