如何基于另一DataFrame的数值范围匹配填充entity列?
基于数值范围匹配两个DataFrame的实现方案
先定义示例数据
首先把你给出的两个DataFrame用代码还原:
import pandas as pd # 第一个DataFrame df1 = pd.DataFrame({ 'value': ['a', 'b', 'c', 'd', 'e'], 'id': [1, 2, 5, 8, 11] }) # 第二个DataFrame(范围匹配表) df2 = pd.DataFrame({ 'entity': ['ABC', 'DEF', 'XYZ'], 'start_range': [1, 4, 8], 'end_range': [3, 7, 15] })
方法一:区间索引匹配(简洁直观)
利用Pandas的IntervalIndex把范围转成可匹配的区间索引,直接通过索引映射获取对应entity:
# 从start_range和end_range创建闭区间索引(包含边界值) interval_index = pd.IntervalIndex.from_arrays( df2['start_range'], df2['end_range'], closed='both' ) # 将df2设置为区间索引,通过df1的id匹配对应的entity df1['entity'] = df2.set_index(interval_index).loc[df1['id'], 'entity'].values # 查看结果 print(df1)
运行后会直接得到你想要的结果,这种方式代码简洁,逻辑清晰,适合中小规模数据集。
方法二:merge_asof匹配(高效适用于大数据)
如果你的数据集行数较多,merge_asof是更高效的选择,它通过近似匹配实现范围关联:
# 先对范围表按start_range排序(merge_asof要求右侧DataFrame按匹配键排序) df2_sorted = df2.sort_values('start_range') # 按id和start_range进行反向近似匹配(找到不大于当前id的最大start_range) merged_df = pd.merge_asof( df1.sort_values('id'), df2_sorted, left_on='id', right_on='start_range', direction='backward' ) # 过滤掉id超出对应end_range的情况(示例数据无此情况,实际场景可保留) merged_df = merged_df[merged_df['id'] <= merged_df['end_range']] # 恢复原DataFrame的顺序并整理列 result = merged_df.sort_index()[['value', 'id', 'entity']] # 查看结果 print(result)
这种方法避免了逐行遍历,性能更优,适合处理十万级以上的大数据量。
内容的提问来源于stack exchange,提问作者aristotle29
相关产品推荐
相关产品推荐

