You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python中对比DataFrame与文本文件内容并生成状态标记列的代码问题排查

问题分析与解决方案

嘿,我发现你的代码里有个关键小错误啦!在apply的lambda函数里,你写的x in content逻辑不对——这里的x是整一行的DataFrame行对象(Series),并不是你要判断的intAintB列的具体值,这就导致判断完全偏离了预期方向,自然跑不出正确结果。

另外给你提个小优化建议:把读取到的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)

关键修正点说明:

  1. 集合优化:将content转为content_set,把列表的O(n)查找复杂度降到集合的O(1),数据量越大效率提升越显著。
  2. 精准判断:直接对f2["intA"]f2["intB"]列单独使用apply,此时lambda里的val就是对应列的每个具体值,判断val in content_set逻辑完全准确。
  3. 简洁拼接:用f-string来拼接结果字符串,写法更直观易读。

运行这段代码后,就能得到你预期的输出:

col1_search,col2_search
P53-Malat1_found,Neat1-Malat1_found
Gap1-Malat1_found,Malat1-Pias3_not_found

内容的提问来源于stack exchange,提问作者Apex

火山引擎 最新活动