Python Dataframe按优先级判断非空值拼接列值的实现问题
实现方案
你原有代码的问题是会把选中列所有非空值全部拼接,没有按照C>D>E的优先级只取首个非空值拼接,下面给出两种可行实现:
方案一:向量化操作(推荐,大数据量下效率更高)
利用pandas按行向后填充的特性,直接取出C/D/E列中优先级最高的非空值,再和B列拼接:
import pandas as pd import numpy as np # 按C>D>E优先级取第一个非空的后缀值 suffix = df[['C', 'D', 'E']].bfill(axis=1).iloc[:, 0] # 拼接B列和后缀,避免空后缀产生多余逗号 df['B'] = np.where(suffix.isna(), df['B'], df['B'] + ', ' + suffix)
方案二:apply自定义逻辑(更直观,适合小数据量)
直接在lambda里写优先级判断逻辑:
df['B'] = df.apply( lambda row: f"{row['B']}, {row['C'] if pd.notna(row['C']) else row['D'] if pd.notna(row['D']) else row['E']}", axis=1 )
验证效果
用你提供的测试数据运行上述代码,得到的B列结果和预期完全一致:
| ID | B. | C. | D. | E |
|---|---|---|---|---|
| 1. | b1_main, d_value | null | d_value | e_value |
| 2. | b2_main, e_value | null | null | e_value |
内容的提问来源于stack exchange,提问作者bobthebilly
相关产品推荐
相关产品推荐

