如何基于另一个DataFrame的时间列过滤当前DataFrame的行?
问题描述
现有包含时间格式数据的DataFrame df,数据如下:
Time lat lon 1/10/2022 11:30 22.12 113.15 1/10/2022 11:32 22.13 113.14 1/10/2022 11:45 22.15 113.19 1/10/2022 12:01 22.11 113.13 1/10/2022 12:11 22.17 113.19
已执行以下代码将Time列转换为时间格式:
df['Time']= pd.to_datetime(df['Time']) df['Time'] = df['Time'].dt.time
指定时间存储在另一个DataFrame dates 中,相关代码如下:
timeList = {'Time': ['1/10/2022 11:30', '1/10/2022 11:45', '1/10/2022 12:01']} dates = pd.DataFrame(data=timeList) dates['Time'] = pd.to_datetime(dates.stack(), format='%d/%m/%Y %H:%M').unstack() dates['Time'] = dates['Time'].dt.time
需要筛选出df中Time列值存在于dates中的行,误以为isin()仅适用于列表,求简便实现方法。预期结果如下:
Time lat lon 1/10/2022 11:30 22.12 113.15 1/10/2022 11:45 22.15 113.19 1/10/2022 12:01 22.11 113.13
解决方案
isin()方法完全支持直接传入Series对象,不需要额外转换为列表,直接用以下代码即可完成筛选:
filtered_df = df[df['Time'].isin(dates['Time'])]
执行后filtered_df就是符合预期的结果。
另外补充一个优化思路:如果不需要单独保留dates数据,可直接将目标时间转换为时间格式列表后传入,代码更简洁:
target_times = pd.to_datetime( ['1/10/2022 11:30', '1/10/2022 11:45', '1/10/2022 12:01'], format='%d/%m/%Y %H:%M' ).time filtered_df = df[df['Time'].isin(target_times)]
内容的提问来源于stack exchange,提问作者user16971617
相关产品推荐
相关产品推荐

