如何匹配两个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
相关产品推荐
相关产品推荐

