如何匹配两个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)
输出结果完全符合预期:
| Artist | Artist_ID | album_id |
|---|---|---|
| Ed Sheeran | 3te43 | 34tge |
| 2 Chainz | 32fh5 | 34erg |
| Kendrick Lamar | 235he | 779uyj |
原代码问题说明
你原来的代码逻辑有两处明显错误:
- 判断逻辑错误:
if i == df1['Artist'].any()的作用是判断i是否等于「df1['Artist']列是否存在非空值」的布尔结果,不是判断i是否存在于df1的Artist列中,正确的判断写法应该是if i in df1['Artist'].values - 遍历效率极低:当数据量较大时,手动遍历行的性能远低于pandas内置的向量化操作,优先用内置方法实现即可
内容的提问来源于stack exchange,提问作者Adu Boahene Q.
相关产品推荐
相关产品推荐

