基于NULL值的数据集合并:按Unique_id/Website匹配的实现求助
按条件切换连接键的左连接实现
数据集示例
第一个数据集(df_1)
Unique_id Name Website Avg 2323aa777 Medigen medigen.org 32 NaN Aster astera.gm 31 4373cc987 Smenda NaN 32
第二个数据集(df_2)
Unique_id Website Rev 3232hh322 smenda.gm 433433 54542ff23 dretbey.gm 542322 8367ff233 brtetu.gm 343433
需求
左连接两个数据集,规则:
- 当df_1的
Unique_id不为空时,以Unique_id作为连接键 - 当df_1的
Unique_id为空时,以Website作为连接键
尝试的错误代码
df_merged = np.where(df_1['Unique_id'].isnull(),df_1.merge(df_2,how='left',on='website',df_1.merge(df_2,how='left',on='unique_id')
正确实现方法
步骤说明
- 统一列名大小写(避免因键名大小写不一致导致匹配失败)
- 将df_1拆分为两个子集:
Unique_id非空的部分、Unique_id为空的部分 - 分别对两个子集执行左连接:
- 非空子集用
Unique_id连接df_2 - 空子集用
Website连接df_2
- 非空子集用
- 合并两个连接结果,可选择恢复原数据顺序
代码实现
import pandas as pd import numpy as np # 假设已加载好两个数据集df_1和df_2 # 统一列名为小写,消除大小写差异 df_1.columns = df_1.columns.str.lower() df_2.columns = df_2.columns.str.lower() # 拆分数据集 mask = df_1['unique_id'].notna() df_non_null_uid = df_1[mask] df_null_uid = df_1[~mask] # 分别执行左连接 merged_non_null = df_non_null_uid.merge(df_2, how='left', on='unique_id') merged_null = df_null_uid.merge(df_2, how='left', on='website') # 合并结果并恢复原顺序(不需要顺序可省略sort_index) df_merged = pd.concat([merged_non_null, merged_null]).sort_index()
补充说明
- 原代码的问题在于
np.where无法直接拼接DataFrame对象,拆分后分别连接是更合理的逻辑 - 第一个数据集中Smenda的Website为NaN,这部分连接后Rev会保持NaN,符合左连接规则
内容的提问来源于stack exchange,提问作者Patrik
相关产品推荐
相关产品推荐

