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

如何在Pandas方法链中移除DataFrame的非数值行?

问题描述

我有一个包含EID列的Pandas DataFrame,该列多数为整数,但存在少量非数值值。我希望在方法链中移除这些非数值对应的行,调试时遇到以下错误:

(Pdb) df.dropna(subset=['EID']).query('EID.str.isnumeric()')
*** ValueError: Cannot mask with non-boolean array containing NA / NaN values
(Pdb) df.dropna(subset=['EID']).query('EID.str.isdigit()')
*** ValueError: Cannot mask with non-boolean array containing NA / NaN values

尝试新增判断列时,结果全为NaN:

(Pdb) df.dropna(subset=['EID']).assign(isnum = lambda x: x.EID.str.isdigit())

样本数据集

输入:

EIDName
123Madsen,Gunnar
retGreene,Richard
465Stull,Matthew

期望输出:

EIDName
123Madsen,Gunnar
465Stull,Matthew

解决方案

问题根源是EID列存在混合类型(整数+字符串),直接调用str方法时,整数类型值会返回NaN,导致筛选报错或生成无效列。核心解决思路是先统一列类型,再做数值判断。

以下是三种适配方法链的实现:

方法1:转字符串后筛选

先把EID转为字符串类型,再用str.isdigit()判断,最后移除临时列:

df_clean = df.dropna(subset=['EID']) \
             .assign(EID_str=lambda x: x['EID'].astype(str)) \
             .query('EID_str.str.isdigit()') \
             .drop(columns='EID_str')

方法2:用apply统一转换判断

直接对每个值转字符串后判断,一步完成筛选:

df_clean = df.dropna(subset=['EID']) \
             .loc[lambda x: x['EID'].apply(lambda val: str(val).isdigit())]

方法3:强制转为数值类型过滤

利用pd.to_numeric将非数值转为NaN,再通过dropna移除对应行,适合需要数值类型EID的场景:

df_clean = df.assign(EID=lambda x: pd.to_numeric(x['EID'], errors='coerce')) \
             .dropna(subset=['EID']) \
             .astype({'EID': int})  # 可选:将EID转回整数类型

内容的提问来源于stack exchange,提问作者Josh English

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:03:11