多列连接两个数据集并标记不匹配列的实现方法
实现方法(基于Pandas)
完全可以实现你的需求,以下是具体步骤:
1. 构建数据集
先把你提供的两个数据集转换成Pandas DataFrame:
import pandas as pd import numpy as np df_1 = pd.DataFrame({ 'my_id': ['ABC111', 'ABC113', 'ADC110', 'ABC145', 'ACC122'], 'col_1': [np.nan, 456, 757, 366, np.nan], 'col_2': [289, 279, 289, 299, 289], 'value': [374578, 335368, 374568, 374578, 374220] }) df_2 = pd.DataFrame({ 'my_id': ['ABC000', 'ABC113', 'ADC110', 'ABC145', 'ACC122', 'ACC999'], 'col_1': [np.nan, 456, 757, 366, np.nan, np.nan], 'col_2': [289, 279, np.nan, 299, 289, 289], 'value_new': [374578, 330008, 374568, 374578, 374229, 374229] })
2. 添加列存在性检查
针对df_2的每个字段,判断其值是否存在于df_1的对应列中(注意处理空值np.nan的特殊情况,因为np.nan不等于任何值包括自身,需要单独判断):
# 检查my_id是否在df_1的my_id列中 df_2['my_id_check'] = np.where(df_2['my_id'].isin(df_1['my_id']), 'Yes', 'No') # 检查col_1:空值需判断df_1的col_1是否包含空值,非空值直接检查存在性 df1_col1_has_null = df_1['col_1'].isna().any() df_2['col_1_check'] = np.where( df_2['col_1'].isna(), 'Yes' if df1_col1_has_null else 'No', np.where(df_2['col_1'].isin(df_1['col_1'].dropna()), 'Yes', 'No') ) # 检查col_2:逻辑同col_1 df1_col2_has_null = df_1['col_2'].isna().any() df_2['col_2_check'] = np.where( df_2['col_2'].isna(), 'Yes' if df1_col2_has_null else 'No', np.where(df_2['col_2'].isin(df_1['col_2'].dropna()), 'Yes', 'No') ) # 检查value_new是否在df_1的value列中 df_2['val_check'] = np.where(df_2['value_new'].isin(df_1['value']), 'Yes', 'No')
3. 最终结果
执行代码后,df_2会生成你需要的格式:
my_id col_1 col_2 value_new my_id_check col_1_check col_2_check val_check 0 ABC000 NaN 289.0 374578 No Yes Yes Yes 1 ABC113 456.0 279.0 330008 Yes Yes Yes No 2 ADC110 757.0 NaN 374568 Yes Yes No Yes 3 ABC145 366.0 299.0 374578 Yes Yes Yes Yes 4 ACC122 NaN 289.0 374229 Yes Yes Yes No 5 ACC999 NaN 289.0 374229 No Yes Yes No
注:你提供的期望输出中,ACC122行的col_1_check和col_2_check标记为No,这与实际逻辑不符——df_1的col_1包含空值、col_2包含289,所以这两个检查应该为Yes,推测是笔误。如果你的需求是基于相同my_id匹配行后对比列值,可以调整代码逻辑,比如先按my_id合并两个DataFrame,再逐列对比。
内容的提问来源于stack exchange,提问作者johnnydoe
相关产品推荐
相关产品推荐

