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)
关键说明
- 逻辑运算符的正确使用:用
&连接所有停用条件,表示“同时满足”,再用~取反,表示“不满足这个组合条件”。 - 重复列名处理:你的原始CSV第一行有两个
APNTPLID,Pandas读取后会把第二列命名为APNTPLID.1,如果确实需要保留这两列,记得在选择列的时候用正确的列名。 index=False参数:保存CSV时加上这个参数,可以避免把Pandas的索引列也保存到文件里,让输出更干净。
运行这个脚本后,就只会保留最后3条激活状态的记录啦!
内容的提问来源于stack exchange,提问作者R. John
相关产品推荐
相关产品推荐

