如何筛选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
相关产品推荐
相关产品推荐

