如何解决如何在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_first
和date_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'>
解决方法
将字符串切片与apply
和lambda
一起使用:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。