Python Pandas实现同名时间区间布尔掩码筛选及跨表字段赋值
解决Pandas DataFrame按Name匹配时间区间并赋值的问题
前提准备:统一时间字段类型
首先确保所有时间字段为datetime类型,避免字符串比较引发异常:
import pandas as pd # 转换时间字段为datetime类型 df['Start Time'] = pd.to_datetime(df['Start Time']) df['End Time'] = pd.to_datetime(df['End Time']) df2['Time'] = pd.to_datetime(df2['Time'])
方法一:合并后生成掩码(适用于单Name对应单时间区间)
- 按
Name合并两个DataFrame,将df的时间区间和Occ字段关联到df2每一行:
merged_df = df2.merge(df[['Name', 'Start Time', 'End Time', 'Occ']], on='Name', how='left')
- 生成布尔掩码,标记
Time是否处于对应Name的时间区间内:
mask = (merged_df['Time'] >= merged_df['Start Time']) & (merged_df['Time'] <= merged_df['End Time'])
- 将匹配到的
Occ字段赋值给df2:
# 仅给匹配成功的行赋值,未匹配行留空(NaN) df2['Occ'] = merged_df['Occ'].where(mask, pd.NA)
方法二:逐行匹配(适用于单Name对应多时间区间)
如果df中同一个Name对应多个时间区间,用apply逐行检查匹配:
- 生成布尔掩码:
df2['in_time_range'] = df2.apply( lambda row: not df[(df['Name'] == row['Name']) & (df['Start Time'] <= row['Time']) & (df['End Time'] >= row['Time'])].empty, axis=1 )
- 赋值
Occ字段(取第一个匹配区间对应的Occ):
def assign_occ(row): matched_rows = df[(df['Name'] == row['Name']) & (df['Start Time'] <= row['Time']) & (df['End Time'] >= row['Time'])] return matched_rows['Occ'].iloc[0] if not matched_rows.empty else pd.NA df2['Occ'] = df2.apply(assign_occ, axis=1)
内容的提问来源于stack exchange,提问作者Chopin
相关产品推荐
相关产品推荐

