如何在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())
样本数据集
输入:
| EID | Name |
|---|---|
| 123 | Madsen,Gunnar |
| ret | Greene,Richard |
| 465 | Stull,Matthew |
期望输出:
| EID | Name |
|---|---|
| 123 | Madsen,Gunnar |
| 465 | Stull,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
相关产品推荐
相关产品推荐

