Return 仅来自 Pandas Dataframe 的非数字元素

Return Non-Numeric Elements Only from Pandas Dataframe

我有一个从 .CSV 文件创建的数据框。每列应仅包含数值,但有时可以是字符串('>18'、'<5'、'CANCELED' 等)

在使用 pd.to_numeric 将列转换为数字并强制非数字之前,我想创建一个新的数据框或字典,其中包含在每列中找到的唯一非数字值。这将有助于了解我们正在接收哪些类型的非数字输入,以便将我们的特征用于一个或多个预测模型。

这似乎是一个相当简单的任务,但我对 Python 还很陌生,很难弄明白。

到目前为止,我已经将数据框减少到只有 dtype 对象的列,这似乎是一个很好的第一步,并删除了大部分具有所有数值的列:

df = df.select_dtypes(include='object')

我在想我需要遍历每个元素并使用 isnumeric() 应用一些函数来创建一个新的数据框?或者每个列名都包含字符串值作为键名并且字典值是在该列中找到的唯一字符串值列表的字典?

非常感谢任何有关解决此问题的最有效方法的帮助。

示例数据框:

FEATURE_1   FEATURE_2   FEATURE_3   FEATURE_4
1               1         <1.5        >3.4
Nan             2           2           4
4            CANCELED       3          4.5
1.34            2         <1.5         <2

期望的输出:

{'FEATURE_2':['CANCELED'],'FEATURE_3':['<1.5'],'FEATURE_4':['>3.5','<2']}

谢谢!

一个想法是尝试将每个系列中的每个项目转换为 float。如果成功,return NaN;否则,return 元素。

使用 dropnadrop_duplicates 删除可转换字符串和重复项。

import pandas as pd
import numpy as np
from io import StringIO

mystr = StringIO("""FEATURE_1   FEATURE_2   FEATURE_3   FEATURE_4
1               1         <1.5        >3.4
NaN             2           2           4
4            CANCELED       3          4.5
1.34            2         <1.5         <2""")

# replace mystr with 'file.csv'
df = pd.read_csv(mystr, delim_whitespace=True)

# define float converter check
def converter(x):
    try:
        x = float(x)
        return np.nan
    except ValueError:
        return x

# use list comprehension to apply function and clean up
res = {col: df[col].apply(converter).dropna()\
                   .drop_duplicates().tolist() for col in df}

{'FEATURE_1': [],
 'FEATURE_2': ['CANCELED'],
 'FEATURE_3': ['<1.5'],
 'FEATURE_4': ['>3.4', '<2']}