跳转到内容

高级合并:处理真实世界的复杂情况

理想情况下两个表有同名的连接键。但现实往往不是这样——左表叫 model_name,右表叫 model;或者你需要按多个列的组合来匹配;又或者连接键在索引里而不是普通列中。这一节讲这些高级场景。

列名不同时:left_on + right_on

python
import pandas as pd

left = pd.DataFrame({
    'model_name': ['GPT-4o', 'Claude', 'Llama'],
    'params_B': [1760, 175, 70],
})

right = pd.DataFrame({
    'model_id': ['GPT-4o', 'Claude', 'Llama', 'Qwen'],
    'MMLU': [88.7, 89.2, 84.5, 83.5],
})

merged = pd.merge(left, right,
                  left_on='model_name',
                  right_on='model_id',
                  how='left')

cleaned = merged.drop(columns=['model_id'])
print(cleaned)

left_onright_on 让你分别指定左右表的连接列——它们不需要同名。合并后通常会有一个多余的重复键列(model_id),用 drop() 清理掉即可。这是实际工作中最高频的 merge 用法之一——因为不同数据源的命名规范几乎总是不一致的。

多键合并

python
import pandas as pd
import numpy as np

conversations = pd.DataFrame({
    'user_id': ['u1', 'u1', 'u2'],
    'session_id': ['s1', 's2', 's1'],
    'prompt': ['hello', 'world', 'hi'],
})

labels = pd.DataFrame({
    'user_id': ['u1', 'u1', 'u2'],
    'session_id': ['s1', 's2', 's1'],
    'quality': [4.5, 3.8, 4.2],
})

labeled = pd.merge(conversations, labels,
                   on=['user_id', 'session_id'])
print(labeled)

当单个列无法唯一标识一行时(比如同一个用户有多个会话),就需要用多列组合作为连接键。on 参数接受列表形式的多键。

基于 MIT 许可发布