如何使用pandas提取含指定关键词的行并导出为CSV文件
代码问题定位
你原有代码的核心错误在判断条件any(df['text'][i] for x in keywords):这行代码根本没有执行关键词和文本的匹配逻辑,只要当前行的text字段不是空值,判断结果就为True,最终会把所有非空的短信行全部存入结果,自然和预期不符。另外手动写for循环逐行遍历的写法效率极低,数据量稍大时运行速度会非常慢,pandas本身提供了专门的字符串向量化处理方法,完全不需要手写循环。
正确实现代码
import pandas as pd # 待匹配的关键词列表 keywords = ["SBI", "HDFC", "Canara", "HSBC", "KTK"] # 读取原始短信数据集 df = pd.read_csv("SMS.csv", sep=",") # 拼接关键词为正则匹配规则,|代表匹配任意一个关键词 match_rule = "|".join(keywords) # 筛选text列包含任意关键词的行,na=False代表空值直接判定为不匹配,避免报错 # 如果需要不区分大小写匹配,可在str.contains里加参数case=False matched_result = df[df["text"].str.contains(match_rule, na=False)] # 如果需要保留原表所有列,直接导出matched_result即可 # 如果像你原代码那样只需要提取文本列、重命名为senderAddress,就替换成下面这行 # matched_result = matched_result[["text"]].rename(columns={"text": "senderAddress"}) # 导出为新CSV文件 matched_result.to_csv("new_data.csv", index=False)
注意事项
- 不要用逐行for循环处理pandas数据,内置的向量化方法代码更简洁、运行速度快几个量级,也不容易写错逻辑
- 如果需要精确匹配整词、避免部分字符串误匹配(比如不想匹配到包含"SBI"的其他长单词),可以给匹配规则加单词边界,改成
match_rule = r"\b(" + "|".join(keywords) + r")\b"即可 - 导出前可以先打印
matched_result.head()看前几行结果,确认匹配逻辑符合要求再导出文件
内容的提问来源于stack exchange,提问作者Bala Murali
相关产品推荐
相关产品推荐

