Python pandas如何根据条件从指定列取值填充新增Value列
实现方法
你可以用如下方法实现需求,支持检查列动态扩展,无需修改核心逻辑:
首先确保已导入依赖库:
import pandas as pd import numpy as np
定义通用匹配取值函数,适配任意数量的检查列:
def get_match_series(df, check_col_list, match_key): # 拆分检查列和取值列:列表最后一个元素为取值列,其余为需要检查匹配的列 check_cols = check_col_list[:-1] value_col = check_col_list[-1] # 生成匹配掩码:只要任意一个检查列等于目标关键词即满足条件 match_mask = df[check_cols].eq(match_key).any(axis=1) # 满足条件返回对应取值,否则返回空值 return df[value_col].where(match_mask)
分别对DS1、DS2执行匹配,合并结果到新列Value:
# 分别获取两个数据源的匹配结果 ds1_result = get_match_series(df, ds1_col_check, var_check) ds2_result = get_match_series(df, ds2_col_check, var_check) # 合并结果,默认DS1优先级高于DS2,若需调整优先级可交换两个变量的位置 df['Value'] = ds1_result.combine_first(ds2_result)
扩展性说明
如果需要增加检查列,直接把新的检查列名加到对应配置列表的前面即可(列表最后一位始终保留为取值列),无需修改函数逻辑。比如要给DS1增加DS1.ColC作为检查列,只需要修改配置为:
ds1_col_check = ["DS1.ColA","DS1.ColB","DS1.ColC","DS1.Val"]
如果需要调整多个数据源都满足时的取值逻辑,比如拼接两个值,可以将合并步骤替换为:
# 示例:两个数据源都满足时用逗号拼接取值 df['Value'] = ds1_result.fillna('').astype(str) + ds2_result.fillna('').apply(lambda x: f',{x}' if pd.notna(x) else '') df['Value'] = df['Value'].replace('', np.nan)
内容的提问来源于stack exchange,提问作者Fazli
相关产品推荐
相关产品推荐

