我有一个从.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
;否则,返回该元素。
使用dropna
和drop_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/