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

如何筛选MultiIndex DataFrame中索引匹配另一DataFrame的行

筛选MultiIndex DataFrame中与另一DataFrame匹配的行

嗨,我来帮你搞定这个需求!你需要从带多层索引的DF1里,找出那些索引和DF2中year、month列完全匹配的行对吧?这里有两种简洁高效的方法,我一步步给你拆解清楚。

首先,咱们先把示例数据搭建好,方便后续测试:

import pandas as pd

# 构造DF1并设置(year, month)为多层索引
df1 = pd.DataFrame({
    'month': [1, 3, 4, 7, 10], 
    'year': [2012, 2012, 2014, 2013, 2014], 
    'sale':[55, 17, 40, 84, 31]
})
df1 = df1.set_index(['year','month'])

DF1的结构是这样的:

sale
year month      
2012 1        55
     3        17
2014 4        40
2013 7        84
2014 10       31

再构造一个DF2示例,假设我们要匹配2012年1月、2014年4月和2014年10月:

df2 = pd.DataFrame({
    'year': [2012, 2014, 2014],
    'month': [1, 4, 10]
})

方法一:利用index.isin()直接匹配索引

这是最直观的方法,把DF2的每行转换成和DF1索引格式一致的元组,然后筛选匹配项:

# 将DF2的year和month转换成元组列表(和DF1的索引结构对应)
match_tuples = list(df2.itertuples(index=False, name=None))

# 筛选DF1中索引在匹配列表里的行
filtered_df = df1[df1.index.isin(match_tuples)]

运行后得到的结果:

sale
year month      
2012 1        55
2014 4        40
2014 10       31

方法二:用merge合并筛选(适合需保留DF2额外列的场景)

如果DF2还有其他业务列需要和DF1关联,用merge会更灵活:

# 先把DF1的多层索引还原成普通列,再和DF2做内连接
merged_result = df1.reset_index().merge(df2, on=['year', 'month'], how='inner')

# 可选:如果需要恢复多层索引,再重新设置
filtered_df = merged_result.set_index(['year','month'])

这种方法的优势在于,要是DF2有比如target_value这类额外列,合并后可以直接保留,不用额外处理。


注意事项

  • 确保DF1的多层索引顺序和DF2的列顺序完全对应,比如DF1索引是(year, month),DF2就要用year和month的顺序生成元组,不能搞反。
  • 检查year和month的数据类型一致,比如都是整数,避免因类型不匹配导致匹配失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:04:32