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

如何基于条件利用第二个DataFrame索引为首个pandas DataFrame新增列

高效实现DataFrame多条件匹配并提取首个匹配索引

针对你的需求,这里提供一个基于pandas内置操作的高效方案,完全避免循环,适合处理百万级别的df2数据:

步骤说明

  1. 将df2的自定义索引转换为普通列,方便后续处理
  2. 对df2按匹配字段分组,只保留每组的第一行(确保每个匹配组合仅取首个索引)
  3. 重命名df2的列名,和df1的匹配列对齐
  4. 通过左合并将匹配结果关联到df1中

完整代码

import pandas as pd

# 示例数据
df1 = pd.DataFrame({'month': [1, 4, 7, 10],
                   'year': [2012, 2014, 2013, 2014],
                   'sale': [55, 40, 84, 31]})
df2 = pd.DataFrame({'month1': [2,3,4,1, 4, 7, 10],
                   'year1': [2012,2012,2012,2012, 2014, 2013, 2014],
                   'sale1': [34,35,36,55, 40, 84, 31]},
                   index=[100, 200, 300, 411,444,415,416])

# 步骤1:将df2的索引转为列
df2 = df2.reset_index().rename(columns={'index': 'index_result'})

# 步骤2:按匹配字段分组,保留每个组合的第一个匹配索引
df2_unique = df2.groupby(['month1', 'year1', 'sale1'], as_index=False).first()

# 步骤3:重命名df2的列,和df1对齐
df2_unique = df2_unique.rename(columns={'month1': 'month', 'year1': 'year', 'sale1': 'sale'})

# 步骤4:左合并df1和处理后的df2,得到结果
df_result = df1.merge(df2_unique, on=['month', 'year', 'sale'], how='left')

print(df_result)

输出结果

month  year  sale  index_result
0      1  2012    55           411
1      4  2014    40           444
2      7  2013    84           415
3     10  2014    31           416

效率说明

  • 分组操作groupby().first()是pandas底层优化的矢量化操作,处理百万行df2的速度远快于循环
  • 合并操作merge基于哈希表实现,时间复杂度接近O(m+n)(m为df1行数,n为df2行数),适合大规模数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 13:52:46