You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中对比两个DataFrame索引并填充df1的C列?

如何根据索引区间匹配填充DataFrame列?

嘿,这个需求刚好对应Pandas里的前向区间匹配场景,用merge_asof或者pd.cut都能轻松实现,下面给你详细拆解:

先明确需求逻辑

你的规则是:df1的索引值落在df2两个相邻索引之间时,就取df2中前一个索引对应的Name(比如3、4在2和5之间→Tom;6、7在5和8之间→Jack,最后15、16大于14→Lucy)。


方法1:用merge_asof(推荐,大数据量更高效)

merge_asof专门用来处理"按键匹配最近的前/后值"的场景,完全契合我们的需求:

步骤1:构造示例数据(方便你复现)

import pandas as pd
import numpy as np

# 构建df1
df1 = pd.DataFrame(
    data={'A': ['a','b','c','d','e','f','g','h','i','j']},
    index=[3,4,6,7,9,10,12,13,15,16]
)
df1['C'] = np.nan

# 构建df2,并把索引转为列(merge_asof需要基于列匹配)
df2 = pd.DataFrame(
    data={'Name': ['Tom','Jack','Rose','Marrie','Lucy']},
    index=[2,5,8,11,14]
).reset_index().rename(columns={'index': 'N'})

步骤2:执行前向匹配并填充

# 把df1的索引转为临时列,用于匹配
df1_temp = df1.reset_index().rename(columns={'index': 'idx'})

# 用merge_asof匹配:找df2中N <= df1.idx的最大N对应的Name
merged_df = pd.merge_asof(df1_temp, df2, left_on='idx', right_on='N', direction='forward')

# 将匹配到的Name赋值回df1的C列,恢复原索引
df1['C'] = merged_df['Name']
df1 = df1.set_index('idx')

方法2:用pd.cut(手动划分区间,逻辑直观)

如果你更喜欢手动定义区间的方式,pd.cut也能实现:

# 定义区间边界:df2的N值 + 无穷大(覆盖最后一组数据)
bins = df2['N'].tolist() + [float('inf')]
# 定义每个区间对应的Name标签
labels = df2['Name'].tolist()

# 给df1的索引划分区间,映射到对应的Name
df1['C'] = pd.cut(df1.index, bins=bins, labels=labels, include_lowest=True)

最终结果

两种方法执行后,df1都会变成你想要的样子:

indexAC
3aTom
4bTom
6cJack
7dJack
9eRose
10fRose
12gMarrie
13hMarrie
15iLucy
16jLucy

内容的提问来源于stack exchange,提问作者FunkyMore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:01:48