如何在Pandas DataFrame中排除指定日期的数据?
解决Pandas筛选数据时出现的KeyError: True问题
嘿,咱们先来拆解下你遇到的KeyError: True到底是怎么回事:
问题根源
你写的这行筛选代码有语法逻辑错误:
df2 = df["date" != datetime.datetime.strptime('2018-04-08', '%Y-%m-%d').date()]
这里的"date" != 目标日期会先被计算成一个布尔值True(因为字符串"date"和datetime.date对象肯定不相等),这时候你相当于在告诉Pandas“给我取名为True的列”,但你的DataFrame里根本没有这个列,自然就抛出了KeyError: True。
正确的姿势应该是:先取出DataFrame中的date列,再和目标日期做比较,得到一个布尔索引,用这个索引去筛选你需要的行。
修正后的代码方案
方案1:修正Pandas筛选逻辑
调整代码的筛选部分,把列引用和比较逻辑分开:
import pandas as pd import psycopg2 import pandas.io.sql as psql import datetime conn = psycopg2.connect(database="metrics", user="souvik", password="********", host="localhost", port="5432") cur = conn.cursor() df = psql.read_sql("Select * from device_mse", conn) # 先定义目标日期,再用列做比较 target_date = datetime.datetime.strptime('2018-04-08', '%Y-%m-%d').date() df2 = df[df["date"] != target_date] print(df2)
方案2:更高效的方式——直接在SQL中过滤(强烈推荐)
其实完全没必要把所有数据都拉到Pandas里再筛选,直接在SQL查询阶段就排除掉2018-04-08的记录,这样能减少数据传输量,运行效率更高:
import pandas as pd import psycopg2 import pandas.io.sql as psql conn = psycopg2.connect(database="metrics", user="souvik", password="********", host="localhost", port="5432") cur = conn.cursor() # 直接在SQL语句中添加过滤条件 df = psql.read_sql("SELECT * FROM device_mse WHERE date != '2018-04-08'", conn) print(df)
额外提示:如果要永久删除数据库中的记录
如果你的需求是把数据库里2018-04-08的记录彻底删掉,而不是仅仅在DataFrame中过滤,那应该直接执行SQL的DELETE语句,而不是用Pandas处理:
import psycopg2 conn = psycopg2.connect(database="metrics", user="souvik", password="********", host="localhost", port="5432") cur = conn.cursor() # 执行删除操作,一定要记得提交事务! cur.execute("DELETE FROM device_mse WHERE date = '2018-04-08'") conn.commit() # 关闭连接 cur.close() conn.close()
⚠️ 注意:执行删除操作前,建议先运行SELECT * FROM device_mse WHERE date = '2018-04-08'确认要删除的记录数量,最好备份一下数据再操作哦。
内容的提问来源于stack exchange,提问作者Souvik Ray
相关产品推荐
相关产品推荐

