Pandas如何逐行检测指定列非空值并提取对应列名数字
逐行提取非空列对应数字的实现方法
直接用pandas内置操作就能实现,不用写复杂循环,以下是可直接运行的代码:
首先先明确要检测的目标列,提前把列名和要提取的数字做映射,避免重复解析列名:
import pandas as pd # 定义需要检测的列 check_cols = ['col_1', 'col_45', 'col_9', 'col_10'] # 提前解析列名对应的数字,生成映射字典 col_to_num = {c: int(c.split('_')[1]) for c in check_cols}
方法1:易读版(推荐小数据集用)
用apply逐行判断非空值,直接生成结果列表,代码可读性高:
df['extracted_nums'] = df[check_cols].apply( lambda row: [col_to_num[c] for c in check_cols if pd.notna(row[c])], axis=1 )
用你给出的示例DataFrame运行后,extracted_nums列的结果完全符合预期:
- 第1行(索引1.0):
[1, 9] - 第2行(索引2.0):
[9, 10] - 第3行(索引3.0):
[1, 10]
方法2:高性能版(推荐大数据集用)
如果你的数据量在十万行以上,apply(axis=1)效率偏低,可以用向量化的非空判断加列表推导,速度能快3~5倍:
# 一次性生成所有行的非空掩码 notna_mask = df[check_cols].notna().to_numpy() df['extracted_nums'] = [ [col_to_num[check_cols[idx]] for idx, valid in enumerate(row_mask) if valid] for row_mask in notna_mask ]
如果你对「有效值」的判定不是仅排除NaN,比如还要排除0、空字符串、负数这类值,只需要把上面代码里的
pd.notna(row[c])或者notna_mask的生成逻辑替换成你自己的判断规则就行。
内容的提问来源于stack exchange,提问作者EngGu
相关产品推荐
相关产品推荐

