Pandas按不同过滤列表筛选DataFrame失效 输出为原始拼接结果
错误原因
- 核心错误是过滤列表的读取逻辑完全不成立:你代码里的
filtration_1/filtration_2/filtration_3本身就是直接定义的整数ID列表,不是本地文件路径。open(f"{filtration_n}", "r")会通过f-string把列表转成字符串作为文件名(等价于尝试打开名为[166, 167]的文件),正常运行这行应该直接抛出FileNotFoundError。如果你没遇到报错,大概率是调试时残留了同名空文件,或者代码里有异常捕获逻辑吞掉了报错,最终读出来的lines1/lines2/lines3全是空列表。 - 存在隐藏的类型匹配问题:就算你真的是从文本文件读取过滤ID,逐行读出来的内容是字符串类型,而DataFrame的
ID列是整数类型,isin()做匹配时字符串和整数不会判定为相等,即使列表有值也匹配不到目标ID,过滤同样失效。 - 当传入
isin()的是空列表时,会返回全False的布尔序列,前面加取反符~之后就变成全True,相当于选中DataFrame的所有行,最终拼接出来的结果自然是三个原始DataFrame的全集,看起来和没做过滤完全一样。
修正代码
如果过滤列表是直接写在代码里的,完全不需要走文件读取流程,直接使用列表做匹配即可,修正后代码如下:
import pandas as pd # 直接定义过滤ID列表 filtration_1 = [166, 167] filtration_2 = [161, 125] filtration_3 = [125, 198] # 读取原始数据 df1 = pd.read_csv(data1, sep="\t", names=["ID", "time", "name", "value"]) df2 = pd.read_csv(data2, sep="\t", names=["ID", "time", "name", "value"]) df3 = pd.read_csv(data3, sep="\t", names=["ID", "time", "name", "value"]) # 按对应规则过滤 new_df1 = df1[~df1["ID"].isin(filtration_1)] new_df2 = df2[~df2["ID"].isin(filtration_2)] new_df3 = df3[~df3["ID"].isin(filtration_3)] # 拼接结果,加ignore_index重置索引避免索引重复 df = pd.concat([new_df1, new_df2, new_df3], ignore_index=True)
如果你的过滤ID实际是存储在独立文本文件中(每行存一个ID),读取时必须把内容转成和ID列一致的整数类型,参考读取逻辑:
# 从文本文件读取ID并转成整数 with open("filtration_1.txt", "r", encoding="utf-8") as f: filtration_1 = [int(line.strip()) for line in f if line.strip()]
批量处理优化:如果实际场景下DataFrame和对应过滤规则的数量很多,可以把「DataFrame对象、对应过滤列表」做成配对元组的列表循环处理,不用重复写重复的读取、过滤逻辑,减少手写代码出错的概率。
内容的提问来源于stack exchange,提问作者tryingToDevelopMyself
相关产品推荐
相关产品推荐

