如何在Python中基于两个数据框删除未完全填充条件的行?

问题描述

我必须有两个数据框。例如,第一个索引的索引范围是2006年12月3日至2006年12月20日。第二行的日期范围是2000年到2020年。当第二行的日期不在第一个行的时间间隔内时,我想删除第二行的行。

考虑以下示例:

一个是这个:

index                           value
'2006-12-03 13:06:21.955000'    3
'2006-12-03 13:14:54.100000'    4
'2006-12-04 13:23:25.929000'    5
'2006-12-05 13:31:58.074000'    6
'2006-12-05 13:40:29.903000'    7
'2006-12-05 13:49:02.048000'    8
'2006-12-06 13:57:33.877000'    9
.
.
.
'2006-12-20 14:06:06.022000'    100
'2006-12-20 14:14:37.851000'    110

第二个是这个:

id  date                name
.
.
.
39  2005-08-22 17:27:00 O
40  2005-09-07 17:40:00 F
41  2006-12-05 10:35:00 X
42  2006-12-13 02:40:00 F
43  2010-08-14 10:05:00 F
44  2011-03-07 20:12:00 M
45  2011-06-07 08:03:00 U
46  2011-08-04 04:12:00 M
47  2011-08-09 08:05:00 P
48  2011-09-22 11:01:00 L
49  2011-11-26 07:10:00 N
50  2012-01-23 03:59:00 M
51  2012-01-27 18:37:00 X
.
.
.

所需的是第二个,但编辑如下:

41  2006-12-05 10:35:00 X
42  2006-12-13 02:40:00 F

->仅保留第一个中也存在的日期。

我尝试了以下命令以根据条件删除行:

second_df = second_df[(second_df.date < date_start_first) | (second_df.date > date_end_first)]

(我受此answer的启发。)

不幸的是,以上代码行不起作用...

date_start_firstdate_end_first提取方式如下:

date_start_first = getStartEndDatesOfDataframe(first_df,"start")
date_end_first = getStartEndDatesOfDataframe(first_df,"end")

使用此功能

def getStartEndDatesOfDataframe(dataSeriesName,start_or_end):
   if (start_or_end == "start"):
       date = dataSeriesName.index[0]
   else:
       date = dataSeriesName.index[len(dataSeriesName.index)-1]
   return date

您能帮我解决这个问题吗?

P.S .:两个“日期”具有相同的类型,我使用type()函数进行验证:

print(type(second_df.date[3]),type(first_df.index[3]))

它给出了:

<class 'pandas._libs.tslibs.timestamps.Timestamp'> <class 'pandas._libs.tslibs.timestamps.Timestamp'>

解决方法

将字符串切片与applylambda一起使用:

import pandas as pd

df_1 = pd.DataFrame([
   ['2006-12-03 13:06:21.955000',3],['2006-12-03 13:14:54.100000',4],['2006-12-04 13:23:25.929000',5],['2006-12-05 13:31:58.074000',6],['2006-12-05 13:40:29.903000',7],['2006-12-05 13:49:02.048000',8],['2006-12-06 13:57:33.877000',9]
],columns=["Date","value"]
)

df_2 = pd.DataFrame([
    ["2005-08-22 17:27:00","O"],["2005-09-07 17:40:00","F"],["2006-12-05 10:35:00","X"],["2006-12-13 02:40:00",["2010-08-14 10:05:00",["2011-03-07 20:12:00","M"],["2011-06-07 08:03:00","U"],["2011-08-04 04:12:00",["2011-08-09 08:05:00","P"],["2011-09-22 11:01:00","L"],["2011-11-26 07:10:00","N"],["2012-01-23 03:59:00",["2012-01-27 18:37:00","X"]
],"name"]
)

df_1.set_index(["Date"],inplace=True)
dt = [d[:10] for d in df_1.index.values]
filt = df_2.Date.apply(lambda x: x[:10] in dt)
print(df_2[filt])

产生:

                  Date name
2  2006-12-05 10:35:00    X