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

如何匹配两个Pandas DataFrame的列并同步对应第三列数据?

解决Pandas DataFrame匹配并复制列的问题

这问题我熟,用Pandas的内置方法就能轻松搞定!咱们结合你给的示例来一步步说:

首先先补全你的示例数据(假设miscset是oset的子集,包含部分some_items):

import pandas as pd

oset = pd.DataFrame({
    'some_items' : ['book', 'cat', 'deer', 'egg'],
    'another_col': ['val1', 'val2', 'val3', 'val4'],  # 假设这是第二列,第三列是root
    'root' : ['boks', 'kattuz', 'deuza', 'ajja']
})

miscset = pd.DataFrame({
    'some_items': ['cat', 'egg', 'fox'],  # fox是oset里没有的,用来测试未匹配情况
    'misc_data': ['info1', 'info2', 'info3']
})

方法一:用merge合并(最直观,适合多列复制)

这是最通用的方法,能基于指定的字符串列匹配,把oset的目标列合并到miscset中:

# 基于some_items列匹配,保留miscset所有行(左连接)
miscset_updated = pd.merge(
    miscset,
    oset[['some_items', 'root']],  # 只取需要匹配的列和要复制的第三列
    on='some_items',
    how='left'
)

关键参数解释:

  • on='some_items':指定用来匹配的字符串列,要求两个DataFrame里这个列的列名一致;如果列名不同,比如oset里叫item_name,miscset里叫some_items,就用left_on='some_items', right_on='item_name'。
  • how='left':左连接会保留miscset的所有行,哪怕在oset里找不到匹配项(这时候root列会填充NaN);如果只想要能匹配上的行,改成how='inner'就行。

方法二:用map映射(轻量,适合单列复制)

如果只需要复制一列,用字典映射的方式更高效:

# 先把oset转换成"匹配列:目标列"的字典
root_mapping = oset.set_index('some_items')['root'].to_dict()

# 给miscset直接添加新列,自动匹配填充
miscset['root'] = miscset['some_items'].map(root_mapping)

注意事项

  • 字符串一致性:匹配前要确保两个DataFrame的字符串列完全一致(比如大小写、前后空格),不然会匹配失败。可以先做清洗:
    # 统一转小写+去除前后空格
    oset['some_items'] = oset['some_items'].str.strip().str.lower()
    miscset['some_items'] = miscset['some_items'].str.strip().str.lower()
    
  • 重复值处理:如果oset的匹配列有重复值,merge会生成多行,这时候可以先给oset去重:
    oset_unique = oset.drop_duplicates(subset='some_items')
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:32:43