我有一个从.CSV文件创建的数据框。每列只应包含数字值,但有时可以是字符串('>'''< 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']}
谢谢!
答案 0 :(得分:0)
一个想法是尝试将每个系列中的每个项目转换为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']}
删除可转换字符串和重复项目。
string input = "Username:King100 ID:100 Level:10";
Match m = Regex.Match(input, @"\s*Level:(?<level>\d+)");
if (m.Success&& m.Groups["level"].Success)
Console.WriteLine(m.Groups["level"].Value);