如何修改DataFrame区间关联代码,让无匹配项返回空值
解决时间区间匹配时无匹配返回空值的问题
原代码报错的核心原因是:当df_1的timestamp不在df_2的任何时间区间内时,df_2.index.get_loc(x)会抛出KeyError,导致整个apply操作失败。下面提供两种可行的修改方案:
方案一:异常捕获(适合小数据集)
通过try-except捕获不存在匹配区间的异常,直接返回空值:
import pandas as pd # 构建IntervalIndex索引 df_2.index = pd.IntervalIndex.from_arrays(df_2['start'], df_2['end'], closed='both') def match_event(x): try: return df_2.iloc[df_2.index.get_loc(x)]['event'] except KeyError: return pd.NA # 也可以用np.nan,pd.NA更适配pandas的缺失值体系 df_1['event'] = df_1['timestamp'].apply(match_event)
方案二:pd.cut映射(适合大数据集,效率更高)
利用pd.cut将timestamp批量映射到对应的区间,再通过索引匹配event,避免循环操作,效率提升明显:
import pandas as pd # 构建IntervalIndex索引 df_2.index = pd.IntervalIndex.from_arrays(df_2['start'], df_2['end'], closed='both') # 用pd.cut获取每个timestamp对应的区间索引(无匹配则为NaN) df_1['interval_idx'] = pd.cut(df_1['timestamp'], bins=df_2.index, labels=False) # 通过索引映射event,无匹配自动返回NaN df_1['event'] = df_1['interval_idx'].map(df_2['event']) # 清理临时列 df_1.drop('interval_idx', axis=1, inplace=True)
两种方案都能实现:有匹配区间的行返回对应的event,无匹配的行返回空值。如果你的数据集较大,优先选方案二,因为apply本质是逐行循环,效率远低于向量化的pd.cut。
内容的提问来源于stack exchange,提问作者slow_learner
相关产品推荐
相关产品推荐

