在Python中,我有一个SQlite数据库,其中包含一个包含事件列表的表。
专栏:
EventName
StartDate
EndDate
DateAdded
可以在多天内将相同的事件添加到表中。该表每天刷新一次。
我需要每天通过比较当天添加的事件和前几天添加的事件来确定是否有任何新事件。
我想我可以编写SQL来实现这个目标:
SELECT e.EventName ,
e.StartDate ,
e.EndDate ,
e.DateAdded
FROM Events AS e
WHERE e.DateAdded = '2017-09-13'
AND NOT EXISTS ( SELECT e2.EventName ,
e2.StartDate ,
e2.EndDate ,
e2.DateAdded ,
e2.EventName
FROM Events AS e2
WHERE e2.DateAdded < '2017-09-13'
AND e2.EventName = e.EventName
);
我想知道是否有办法在没有SQL的情况下执行此操作,即使用pandas或任何其他数据结构? 我问的原因是代码多次引用SQL数据,我在想是否可以查询数据库一次然后对原位数据进行操作,那么资源密集程度就会降低。
示例数据:
EventName Startdate EndDate DateAdded
Liverpool 2017-07-01 2017-07-10 2017-09-01
Manchester 2017-08-01 2017-08-20 2017-09-01
Liverpool 2017-07-01 2017-07-10 2017-09-02
Manchester 2017-08-01 2017-08-20 2017-09-02
London 2017-10-01 2017-10-10 2017-09-02
如果在2017-09-02上运行,我想返回最后一行:
London 2017-10-01 2017-10-10 2017-09-02
答案 0 :(得分:1)
如果您将现有SQL表读入pandas DataFrame df
并将新记录读入DataFrame new_df
,则可以使用以下命令添加旧记录的连接新记录:
df = pd.concat([df, new_df])
...然后通过使用df
标记df
中的所有非唯一行,然后在索引操作中取消这些行,将df.duplicated(keep=False)
仅过滤到新行:
df = df[~df.duplicated(keep=False)]
然后 df
将只包含唯一的行(即SQL表新增的行)。