使用pandas .loc拼接列不符合预期:按条件合并两列遇问题
问题分析与解决方案
你需要在满足EV_EM == 0或COMP_EM == 'Not Done'的条件下,将EV_RND与COMP_EM_RND合并后填充到所有以EMFREAS开头的列,但当前代码未达到预期效果,核心问题出在空值处理、合并顺序和赋值维度匹配上,以下是修正方案:
问题点排查
- 空值拼接异常:如果
EV_RND或COMP_EM_RND为空(比如示例中YA007的初始EV_RND为空),直接用+拼接会生成NaN,无法得到有效字符串。 - 合并顺序不符预期:你的预期结果里,YA007的合并值是
Insufficient|EV ND(COMP_EM_RND在前、EV_RND在后),但原代码拼接顺序是相反的。 - 单空值场景处理缺失:像YA005这种只有一列有值的情况,原代码会生成带空分隔符的无效内容,不符合预期。
修正代码
import pandas as pd # 1. 定义筛选条件 EV_ND = df["EV_EM"] == 0 EM_ND = df['COMP_EM'] == 'Not Done' filter_condition = EV_ND | EM_ND # 2. 封装合并逻辑,处理空值与单值场景 def merge_rnd_cols(row): ev_val = row['EV_RND'].strip() if pd.notna(row['EV_RND']) else '' comp_val = row['COMP_EM_RND'].strip() if pd.notna(row['COMP_EM_RND']) else '' # 按预期顺序合并,仅双值有效时添加分隔符 if ev_val and comp_val: return f"{comp_val}|{ev_val}" return ev_val or comp_val # 3. 生成合并后的结果列 merged_result = df.apply(merge_rnd_cols, axis=1) # 4. 按条件批量赋值到EMFREAS列(转换维度确保广播生效) df.loc[filter_condition, cols_to_fill] = merged_result[filter_condition].values[:, None]
代码说明
- 空值过滤:通过判断值是否为
NaN或空白字符串,避免无效拼接。 - 灵活合并逻辑:双值有效时用
|分隔,单值有效时直接保留该值,覆盖所有场景。 - 维度匹配处理:用
values[:, None]将一维结果转为二维数组,确保能正确批量赋值到多列,避免维度不匹配报错。
验证后预期结果
| ID | EV_EM | COMP_EM | EV_RND | COMP_EM_RND | EMFREAS1 | EMFREAS2 |
|---|---|---|---|---|---|---|
| YA007 | 1 | Not Done | EV ND | Insufficient | Insufficient | EV ND |
| YA006 | 1 | |||||
| YA005 | 0 | Outside grid | EM Not done | EM Not done | EM Not done |
内容的提问来源于stack exchange,提问作者Asha Richardson
相关产品推荐
相关产品推荐

