DataFrame列值匹配提取问题:NA场景未返回预期空值求助
问题描述
现有如下结构的两列DataFrame:
| Extraction | Actual |
|---|---|
| [1_CHECK_90,2_SAVE_43,3_GO_56] | 2_SAVE |
| [1_FIN_54,2_CHECK_22] | 1_FIN_54 |
| [1_L_32,2_Y_79,4_X_66] | 2_Y_79 |
| [5_T_88] | NA |
需求是:通过匹配Extraction列元素左侧的数字前缀,从Extraction中取出Actual列对应的取值。
尝试了以下函数实现,多数场景正常,但当Actual值为NA时,无法返回空列表,需要修复:
def extract_actual(row): try: a =[] for i in row['Extraction']: for j in i: for k in j.split("_"): # print(k) for l in row['Actual']: if k == l: a.append(j) return a except: a =[] return a
解决方案
问题出在哪?
原函数的try-except范围太广,而且当Actual是NA时,代码会继续执行循环对比逻辑,不会主动返回空列表;同时嵌套循环冗余,逻辑绕弯,容易出问题。
修改后的函数
直接先处理NA场景,再做匹配,逻辑更清晰:
def extract_actual(row): actual_val = row['Actual'] # 优先处理Actual为NA的情况,直接返回空列表 if actual_val == 'NA': return [] # 提取Actual的数字前缀(不管Actual是"2_SAVE"还是"1_FIN_54"格式) actual_prefix = actual_val.split("_")[0] matched_items = [] # 遍历Extraction里的每个元素,匹配前缀数字 for item in row['Extraction']: item_prefix = item.split("_")[0] if item_prefix == actual_prefix: matched_items.append(item) return matched_items
逻辑说明
- 先判断Actual是否为
NA,是则直接返回空列表,解决核心问题。 - 提取Actual值的数字前缀(比如从
2_SAVE里拿到2,从1_FIN_54里拿到1)。 - 遍历Extraction的每个元素,提取对应前缀,和Actual的前缀匹配,匹配成功就加入结果列表。
- 去掉冗余的多层嵌套循环,逻辑更直观,也避免了不必要的异常捕获。
测试效果
用原DataFrame测试,结果符合预期:
- 第一行返回
['2_SAVE_43'] - 第二行返回
['1_FIN_54'] - 第三行返回
['2_Y_79'] - 第四行(Actual为NA)返回
[]
内容的提问来源于stack exchange,提问作者Swetha
相关产品推荐
相关产品推荐

