从Pandas DataFrame提取各列唯一非数值元素的方法
提取DataFrame各列的非数值唯一值
我来帮你高效解决这个问题!针对你想排查DataFrame中各列非数值输入类型的需求,这里有个简洁且高效的实现方案,完美匹配你的场景:
实现步骤
1. 准备示例数据
首先我们先还原你给出的示例DataFrame(方便测试代码):
import pandas as pd import numpy as np data = { 'FEATURE_1': [1, np.nan, 4, 1.34], 'FEATURE_2': [1, 2, 'CANCELED', 2], 'FEATURE_3': ['<1.5', 2, 3, '<1.5'], 'FEATURE_4': ['>3.4', 4, 4.5, '<2'] } df = pd.DataFrame(data)
2. 核心代码:提取非数值唯一值字典
利用字典推导式结合pandas的数值转换功能,一行代码就能搞定:
# 提取各列中无法转为数值的唯一值 non_numeric_unique = { col: df[col][pd.to_numeric(df[col], errors='coerce').isna()].unique().tolist() for col in df.select_dtypes(include='object').columns } # 过滤掉没有非数值的列(可选,让结果更整洁) non_numeric_unique = {k: v for k, v in non_numeric_unique.items() if v}
3. 代码解释
pd.to_numeric(df[col], errors='coerce'):尝试将列转为数值类型,无法转换的元素会被强制转为NaN.isna():标记出转换后为NaN的位置(也就是原数据中的非数值元素)df[col][...]:根据标记提取对应的非数值元素.unique().tolist():对提取的元素去重并转为列表- 最后一步过滤操作会移除那些没有非数值的列,避免结果中出现空列表
4. 输出结果
运行上述代码后,你会得到完全符合预期的输出:
print(non_numeric_unique) # 输出: # {'FEATURE_2': ['CANCELED'], 'FEATURE_3': ['<1.5'], 'FEATURE_4': ['>3.4', '<2']}
扩展优化:排除原生NaN
如果你的数据中存在原生的NaN(比如示例中FEATURE_1的NaN),而你不想把这类缺失值算作非数值,可以在筛选条件中加入排除原生NaN的判断:
non_numeric_unique = { col: df[col][(pd.to_numeric(df[col], errors='coerce').isna()) & (~df[col].isna())].unique().tolist() for col in df.select_dtypes(include='object').columns }
内容的提问来源于stack exchange,提问作者EnTwiZle
相关产品推荐
相关产品推荐

