使用Pandas合并两个DataFrame:缺失键设默认值及优先级规则
解决DataFrame合并并设置默认值的需求
我来帮你搞定这个DataFrame合并的需求,咱们先把示例数据明确下来,再一步步实现核心逻辑:
1. 先定义示例DataFrame
首先咱们把你描述的两个DataFrame用代码创建出来,方便后续验证:
import pandas as pd # 你的df1:包含基准base、特殊值%,以及已存在的sys1 df1 = pd.DataFrame({ 'NAME': ['base', '%', 'sys1'], 'RED': [3, 4, 5], '内存': [2.00, 0.10, 0.20] }) # 你的df2:需要处理的目标NAME列表 df2 = pd.DataFrame({ 'NAME': ['sys1', 'sys2'] })
2. 核心实现步骤
你的需求核心是:保留df2的所有NAME,优先使用df1中匹配到的行数据,缺失的NAME用base行作为默认值,具体步骤如下:
步骤1:提取base行作为默认模板
从df1里取出NAME为base的行,作为后续缺失值的填充模板:
# 提取base行并去掉NAME列,只保留需要填充的非键列 default_template = df1[df1['NAME'] == 'base'].drop(columns='NAME').iloc[0]
步骤2:合并两个DataFrame
用左连接方式合并df2和df1,这样能完整保留df2的所有NAME,同时匹配df1中已存在的对应行:
merged_df = df2.merge(df1, on='NAME', how='left')
步骤3:填充缺失值
用刚才提取的base模板,填充合并后结果中的缺失值(也就是df2里在df1中不存在的NAME,比如sys2):
merged_df = merged_df.fillna(default_template)
3. 最终结果
运行完上面的代码后,你会得到符合需求的DataFrame:
NAME RED 内存 0 sys1 5.0 0.20 1 sys2 3.0 2.00
sys1在df1中存在,所以使用了df1里的RED=5、内存=0.20sys2在df1中不存在,所以自动使用了base行的默认值RED=3、内存=2.00
额外说明
如果你的非键列不止这两个,这个方法同样适用——fillna会自动按列名匹配填充,不需要额外修改代码。要是你需要自定义默认值(而不是用base行),直接把default_template换成字典就行,比如:
merged_df = merged_df.fillna({'RED': 0, '内存': 0.0})
内容的提问来源于stack exchange,提问作者lgg
相关产品推荐
相关产品推荐

