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

Python Pandas数据筛选问题:如何正确提取非停用状态的记录

解决Pandas筛选激活记录的问题

嘿,我来帮你搞定这个筛选数据的问题!你现在的脚本逻辑出在筛选条件的逻辑运算符用错了,导致没有正确排除停用记录,我来一步步给你修正:

问题分析

你原本想要排除同时满足所有停用条件的记录,但你的代码里用了一堆|(逻辑或),这意味着只要满足其中一个条件就保留数据——而所有记录的每个字段肯定都是你列的取值之一(比如EPSLOCK要么是"EPSLOCK"要么是0),所以相当于没有做任何筛选,自然会把停用记录也留下来。

正确的逻辑应该是:保留那些不满足所有停用条件的记录,也就是对“所有停用条件同时成立”这个整体取反。

修正后的代码

import pandas as pd

# 读取数据,注意原始CSV有重复的APNTPLID列,Pandas会自动给第二列加后缀(比如APNTPLID.1)
file_path = "C:\\Users\\user1\\data\\testdata.csv"
data = pd.read_csv(file_path)

# 定义停用记录的所有条件(必须同时满足)
deactivated_cond = (
    data["EPSLOCK"] == "EPSLOCK"
    & data["LOCK_S"] == 1
    & data["UPL"] == 1
    & data["UPLP"] == 1
    & data["LOCK_MSIN"] == 1
    & data["LOCK_MSOUT"] == 1
)

# 取反:保留不满足停用条件的记录(也就是激活状态的记录)
filtered_data = data[~deactivated_cond]

# 选择需要的列(注意原始数据有重复的APNTPLID,这里用Pandas自动生成的列名或者你可以手动指定)
# 如果你想要保留两个APNTPLID列,可以写["APNTPLID", "APNTPLID.1", ...],或者检查原始数据是否是输入错误
filtered_data = filtered_data[["APNTPLID", "EPSLOCK", "LOCK_S", "UPL", "UPLP", "LOCK_MSIN", "LOCK_MSOUT", "OCSI", "TCSI"]]

# 保存结果,加上index=False避免保存额外的索引列
filtered_data.to_csv("C:\\Users\\user1\\testresult.csv", index=False)

# 打印结果
print(filtered_data)

关键说明

  1. 逻辑运算符的正确使用:用&连接所有停用条件,表示“同时满足”,再用~取反,表示“不满足这个组合条件”。
  2. 重复列名处理:你的原始CSV第一行有两个APNTPLID,Pandas读取后会把第二列命名为APNTPLID.1,如果确实需要保留这两列,记得在选择列的时候用正确的列名。
  3. index=False参数:保存CSV时加上这个参数,可以避免把Pandas的索引列也保存到文件里,让输出更干净。

运行这个脚本后,就只会保留最后3条激活状态的记录啦!

内容的提问来源于stack exchange,提问作者R. John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:57:36