Python中匹配双区间条件并为DataFrame添加对应列的实现方法
实现DataFrame区间匹配与值映射
首先,先确保我们导入pandas并准备好你提供的原始数据:
import pandas as pd # 初始化data_1 val_1 = [81.322, 81.342, 81.452, 81.552, 82.522, 82.562, 82.722, 81.723, 81.322, 81.332 ] val_2 = [0.234, 0.231, 0.333, 0.324, 0.666, 0.645, 0.334, 0.345, 0.878, 0.888] data_1 = pd.DataFrame({'val_1': val_1, 'val_2': val_2}) # 初始化data_2 val_1_start = [81.100,81.41, 81.99, 81.320 ] val_2_start = [0.230,0.331,0.32, 0.875 ] val_1_end = [81.400,81.554,82.8, 81.333 ] val_2_end = [0.281,0.335,0.68, 0.890] value = [24,21,34,11] data_2 = pd.DataFrame({'val_1_start': val_1_start, 'val_2_start': val_2_start, 'val_1_end': val_1_end, 'val_2_end':val_2_end, 'value': value})
形式一:保留所有记录,不匹配项填充NA
这个需求可以通过apply函数遍历data_1的每一行,检查是否落在data_2的某个区间内,匹配成功则返回对应的value,否则返回pd.NA:
def match_value(row): # 筛选data_2中满足双区间条件的行 matched_rows = data_2[ (data_2['val_1_start'] <= row['val_1']) & (row['val_1'] <= data_2['val_1_end']) & (data_2['val_2_start'] <= row['val_2']) & (row['val_2'] <= data_2['val_2_end']) ] # 如果有匹配结果,返回第一个匹配的value;否则返回NA return matched_rows['value'].iloc[0] if not matched_rows.empty else pd.NA # 给data_1添加value列 data_1['value'] = data_1.apply(match_value, axis=1) # 输出结果 print(data_1)
运行后就会得到你想要的形式一结果,所有原始记录都保留,不满足条件的value列填充为NA。
形式二:只保留匹配成功的记录
如果只需要保留匹配上的记录,我们可以先做交叉连接,再筛选满足条件的行,最后去重(避免同一行匹配多个区间的情况):
# 交叉连接两个DataFrame(通过临时key实现) cross_merged = data_1.assign(temp_key=1).merge(data_2.assign(temp_key=1), on='temp_key').drop('temp_key', axis=1) # 筛选满足双区间条件的行 matched_data = cross_merged[ (cross_merged['val_1_start'] <= cross_merged['val_1']) & (cross_merged['val_1'] <= cross_merged['val_1_end']) & (cross_merged['val_2_start'] <= cross_merged['val_2']) & (cross_merged['val_2'] <= cross_merged['val_2_end']) ][['val_1', 'val_2', 'value']] # 去重(如果你的数据不会出现一行匹配多个区间的情况,可以省略这步) matched_data = matched_data.drop_duplicates(subset=['val_1', 'val_2']) # 输出结果 print(matched_data)
这样得到的就是仅包含匹配成功记录的形式二结果。
小提示
如果data_2中存在重叠区间导致同一行data_1匹配多个value,你可以根据需求调整逻辑:比如取第一个匹配值、最后一个匹配值,或者对匹配的value求和/取均值等。
内容的提问来源于stack exchange,提问作者user3234242
相关产品推荐
相关产品推荐

