我有一个从.CSV文件创建的数据框。每列只能包含数字值,但是有时也可以是字符串('> 18','
在使用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。如果成功,则返回NaN;否则,返回该元素。

使用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']}

关于python - 仅从Pandas Dataframe返回非数值元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50595924/

10-12 19:40