如何基于条件利用第二个DataFrame索引为首个pandas DataFrame新增列
高效实现DataFrame多条件匹配并提取首个匹配索引
针对你的需求,这里提供一个基于pandas内置操作的高效方案,完全避免循环,适合处理百万级别的df2数据:
步骤说明
- 将df2的自定义索引转换为普通列,方便后续处理
- 对df2按匹配字段分组,只保留每组的第一行(确保每个匹配组合仅取首个索引)
- 重命名df2的列名,和df1的匹配列对齐
- 通过左合并将匹配结果关联到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
相关产品推荐
相关产品推荐

