如何筛选Pandas唯一结果中的非数值型值?
筛选Pandas Series中的非数值型唯一值
问题描述
我有一个Pandas Series,调用.unique()方法获取所有唯一值后,尝试筛选出仅包含非数值型的唯一值,执行代码时出现以下错误:
AttributeError: 'float' object has no attribute 'isnumeric'
报错代码:
values = data['Column Name'].unique() non_numeric_values = [value for value in values if not value.isnumeric()] # 报错行
需要解决的问题:
- 如何实现筛选仅非数值型值的目标?
- 该列可能为
objectdtype,值可能是字符串类型。
解决方案
报错原因
报错是因为Series中存在float类型的值(比如空值NaN会被自动转为float),而float对象没有isnumeric()方法——这个方法仅适用于字符串类型。
方法1:统一转字符串后判断(简单直接)
先把所有值转为字符串,再做数值判断,同时按需处理空值:
import pandas as pd values = data['Column Name'].unique() non_numeric_values = [ value for value in values if not (str(value).isnumeric() or pd.isna(value)) ]
str(value)确保所有值都转为字符串,避免float类型报错pd.isna(value)用于排除空值(如果需要保留空值,直接去掉这个判断条件即可)
方法2:用Pandas内置函数(高效稳妥)
如果数据量较大,列表推导式效率偏低,推荐用Pandas的to_numeric函数处理:
import pandas as pd # 将唯一值转为Series unique_series = pd.Series(data['Column Name'].unique()) # 把无法转为数值的内容标记为NaN,再筛选原Series中对应非NaN的内容 non_numeric_values = unique_series[pd.to_numeric(unique_series, errors='coerce').isna()].tolist()
pd.to_numeric(..., errors='coerce')会将所有无法转为数值的内容转为NaN- 筛选原Series中对应位置不为NaN的值,就是我们要的非数值型唯一值
- 这个方法自动兼容字符串、数值、空值等各种类型,适用性更广
方法3:精细类型判断(按需选择)
如果需要区分纯数字字符串和真正的数值类型(比如要排除"123"但保留"123a"),可以用类型判断结合字符串检查:
import pandas as pd values = data['Column Name'].unique() non_numeric_values = [] for value in values: if pd.isna(value): continue # 按需决定是否保留空值 # 排除数值类型(int/float) if isinstance(value, (int, float)): continue # 排除纯数字字符串 if isinstance(value, str) and value.isnumeric(): continue non_numeric_values.append(value)
内容的提问来源于stack exchange,提问作者christophriepe
相关产品推荐
相关产品推荐

