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
相关产品推荐
相关产品推荐

