You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:42:31