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

如何匹配两个DataFrame指定列的字符串并生成关联映射表

实现方案

你要的匹配功能本质是两个DataFrame的内连接操作,无需手动写循环遍历,直接用pandas内置的merge方法即可高效实现,代码如下:

import pandas as pd

def get_mapping_file(df1, df2):
    # 以Artist列为关联键,取两边都存在的匹配项,筛选需要的返回字段
    merged_df = pd.merge(
        left=df1,
        right=df2,
        on='Artist', # 关联的公共列
        how='inner' # 内连接:只保留两边都匹配到的行
    )[['Artist', 'Artist_ID', 'album_id']] # 只保留需要的列
    return merged_df

验证运行效果

拿你给出的示例数据调用函数:

# 示例数据
df1 = pd.DataFrame({
    'Artist':
    ['50 Cent', 'Ed Sheeran', 'Celine Dion', '2 Chainz', 'Kendrick Lamar'],
    'album':
    ['Get Rich or Die Tryin', '+', 'Courage', 'So Help Me God!', 'DAMN'],
    'album_id': ['sdf34', '34tge', '34tgr', '34erg', '779uyj']
})

df2 = pd.DataFrame({
    'Artist': ['Beyonce', 'Ed Sheeran', '2 Chainz', 'Kendrick Lamar', 'Jay-Z'],
    'Artist_ID': ['frd345', '3te43', '32fh5', '235he', '345fgrt6']
})

# 调用函数
result = get_mapping_file(df1, df2)
print(result)

输出结果完全符合预期:

ArtistArtist_IDalbum_id
Ed Sheeran3te4334tge
2 Chainz32fh534erg
Kendrick Lamar235he779uyj

原代码问题说明

你原来的代码逻辑有两处明显错误:

  • 判断逻辑错误:if i == df1['Artist'].any()的作用是判断i是否等于「df1['Artist']列是否存在非空值」的布尔结果,不是判断i是否存在于df1的Artist列中,正确的判断写法应该是if i in df1['Artist'].values
  • 遍历效率极低:当数据量较大时,手动遍历行的性能远低于pandas内置的向量化操作,优先用内置方法实现即可

内容的提问来源于stack exchange,提问作者Adu Boahene Q.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 20:36:04