如何在Pandas中按索引规则合并不同大小的DataFrame?
Pandas实现按索引匹配填充的合并操作
首先构造示例中的两个DataFrame:
import pandas as pd # 构建DataFrame1 df1 = pd.DataFrame( {'value1': ['one', 'two', 'three', 'four', 'five', 'six', 'seven']}, index=pd.Index([1, 2, 3, 4, 5, 6, 7], name='index1') ).reset_index() # 构建DataFrame2 df2 = pd.DataFrame( {'value2': ['just', 'done']}, index=pd.Index([3, 6], name='index2') ).reset_index()
使用merge_asof可以高效实现需求中的匹配逻辑,它会为左表的每个索引值,匹配右表中小于等于该索引的最大对应值,正好符合"index1>=index2时匹配对应value2"的要求:
# 执行匹配合并 df3 = pd.merge_asof( df1, df2, left_on='index1', right_on='index2', direction='backward' # 指定取小于等于左索引的最大右索引对应值 ) # 整理列名并替换空值 df3 = df3.rename(columns={'index1': 'index'}).drop(columns='index2') df3['value2'] = df3['value2'].fillna('<none>') # 输出结果 print(df3)
运行后得到的结果与需求一致:
index value1 value2 0 1 one <none> 1 2 two <none> 2 3 three just 3 4 four just 4 5 five just 5 6 six done 6 7 seven done
补充说明
merge_asof要求右表的匹配键(这里是index2)必须是已排序的,示例中df2的索引已经是升序,无需额外处理;如果未排序,需要先执行df2.sort_values('index2', inplace=True)。- 如果不想使用
merge_asof,也可以通过将df2的索引作为分界点,结合pd.cut和map实现,但merge_asof在性能和代码简洁性上更优。
内容的提问来源于stack exchange,提问作者chen xin
相关产品推荐
相关产品推荐

