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

merge命令`matched`变量匹配失败,求助补全双数据集缺失信息

解决Merge匹配错误并完成数据集补全

你的merge匹配问题核心原因大概率是没指定正确的唯一合并键,或者键变量的格式不一致。要补全第一个数据集的缺失值,我们需要用ISIN、名称和年份三个变量的组合作为合并键——只有这三个一起才能唯一标识每一行数据(同一家银行不同年份的记录是独立行)。

下面我用Python Pandas和R dplyr分别给出完整解决方案,你可以根据常用工具选择:

方法一:Python Pandas实现

1. 构造数据集(实际操作可替换为导入本地数据)

import pandas as pd

# 主数据集(完整度较高的那个)
df_main = pd.DataFrame({
    "ISIN": ["Nr1", "Nr1", "Nr1", "Nr2", "Nr2", "Nr2", "Nr3"],
    "名称": ["Bank1", "Bank1", "Bank1", "Bank2", "Bank2", "Bank2", "Bank3"],
    "年份": [2005, 2006, 2007, 2005, 2006, 2007, 2005],
    "总资产": [30000, 31000, 28000, 150000, None, None, 20000],
    "营业额": [1, 1, 1, 0, 0, 0, 1],
    "资产收益率": [0.5, 0.3, 0.3, 0.8, None, None, 0.7],
    "员工数": [300, 300, 280, 2000, 2200, 2200, 275]
})

# 补充数据集(含缺失值的补全信息)
df_fill = pd.DataFrame({
    "ISIN": ["Nr2", "Nr2"],
    "名称": ["Bank2", "Bank2"],
    "年份": [2005, 2006],
    "总资产": [150000, 180000],
    "资产收益率": [0.8, 1.3]
})

2. 规范合并键格式

确保两个数据集的合并键类型完全一致(比如年份是整数,ISIN和名称是字符串),避免格式差异导致匹配失败:

for df in [df_main, df_fill]:
    df["ISIN"] = df["ISIN"].astype(str)
    df["名称"] = df["名称"].astype(str)
    df["年份"] = df["年份"].astype(int)

3. 左连接+缺失值填充

用左连接保留主数据集的所有行,再用补充数据集的非缺失值覆盖主数据集的缺失值:

# 左连接,指定三个合并键
merged = pd.merge(
    df_main, df_fill, 
    on=["ISIN", "名称", "年份"], 
    how="left", 
    suffixes=("_main", "_fill")
)

# 填充总资产和资产收益率的缺失值
merged["总资产"] = merged["总资产_main"].combine_first(merged["总资产_fill"])
merged["资产收益率"] = merged["资产收益率_main"].combine_first(merged["资产收益率_fill"])

# 删除临时生成的重复列
final_df = merged.drop(columns=["总资产_main", "总资产_fill", "资产收益率_main", "资产收益率_fill"])

执行后,Nr2 Bank2 2006的总资产会被填充为180000,资产收益率填充为1.3;2007年的因补充数据集无对应记录,仍保持缺失。

方法二:R dplyr实现

如果你习惯用R,这个方案同样适用:

library(dplyr)

# 构造数据集
df_main <- tibble(
  ISIN = c("Nr1", "Nr1", "Nr1", "Nr2", "Nr2", "Nr2", "Nr3"),
  名称 = c("Bank1", "Bank1", "Bank1", "Bank2", "Bank2", "Bank2", "Bank3"),
  年份 = c(2005, 2006, 2007, 2005, 2006, 2007, 2005),
  总资产 = c(30000, 31000, 28000, 150000, NA, NA, 20000),
  营业额 = c(1, 1, 1, 0, 0, 0, 1),
  资产收益率 = c(0.5, 0.3, 0.3, 0.8, NA, NA, 0.7),
  员工数 = c(300, 300, 280, 2000, 2200, 2200, 275)
)

df_fill <- tibble(
  ISIN = c("Nr2", "Nr2"),
  名称 = c("Bank2", "Bank2"),
  年份 = c(2005, 2006),
  总资产 = c(150000, 180000),
  资产收益率 = c(0.8, 1.3)
)

# 左连接+缺失值填充
final_df <- df_main %>%
  left_join(df_fill, by = c("ISIN", "名称", "年份")) %>%
  mutate(
    总资产 = coalesce(总资产.x, 总资产.y),
    资产收益率 = coalesce(资产收益率.x, 资产收益率.y)
  ) %>%
  select(-ends_with(".x"), -ends_with(".y"))

关键注意事项

  • 合并键必须唯一:只用ISIN或名称合并会导致同一家银行不同年份的行错误匹配,必须三个键一起用。
  • 统一键的格式:检查两个数据集里的ISIN是否有空格、年份是否为相同类型(字符串/整数),这些细节很容易导致匹配失败。
  • 选择正确的连接方式:左连接(left join)能保留主数据集的所有行,而内连接(inner join)会丢掉无匹配的行,不符合补全需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:08:56