Python中对比DataFrame与文本文件内容并生成状态标记列的代码问题排查
问题分析与解决方案
嘿,我发现你的代码里有个关键小错误啦!在apply的lambda函数里,你写的x in content逻辑不对——这里的x是整一行的DataFrame行对象(Series),并不是你要判断的intA或intB列的具体值,这就导致判断完全偏离了预期方向,自然跑不出正确结果。
另外给你提个小优化建议:把读取到的content转成集合,集合的成员查找速度比列表快很多,数据量大的时候这个差异会特别明显。
下面是修正并优化后的完整代码:
import pandas as pd # 读取f1内容并转为集合,提升查找效率 with open("f1.txt","r") as f1: content_set = set(f1.read().splitlines()) # 读取f2数据集 f2 = pd.read_csv("f2.csv") # 处理col1_search列:针对intA的每个值做存在判断 f2["col1_search"] = f2["intA"].apply( lambda val: f"{val}_found" if val in content_set else f"{val}_not_found" ) # 处理col2_search列:针对intB的每个值做存在判断 f2["col2_search"] = f2["intB"].apply( lambda val: f"{val}_found" if val in content_set else f"{val}_not_found" ) # 查看结果或保存 print(f2[["col1_search", "col2_search"]]) # 若要保存为csv: # f2.to_csv("result.csv", columns=["col1_search", "col2_search"], index=False)
关键修正点说明:
- 集合优化:将
content转为content_set,把列表的O(n)查找复杂度降到集合的O(1),数据量越大效率提升越显著。 - 精准判断:直接对
f2["intA"]和f2["intB"]列单独使用apply,此时lambda里的val就是对应列的每个具体值,判断val in content_set逻辑完全准确。 - 简洁拼接:用f-string来拼接结果字符串,写法更直观易读。
运行这段代码后,就能得到你预期的输出:
col1_search,col2_search
P53-Malat1_found,Neat1-Malat1_found
Gap1-Malat1_found,Malat1-Pias3_not_found
内容的提问来源于stack exchange,提问作者Apex




