应用于空字段时发生OneHotEncoding错误

时间:2019-03-08 00:25:05

标签: python csv typeerror one-hot-encoding

该代码包括将OneHotEncoding技术应用于binetflow文件的两个字段: Proto State 。我必须对5个文件执行此操作。我能够将下面的代码完美地应用于前两个代码。当到达第三位时,将引发错误:

  

TypeError:“ str”和“ float”的实例之间不支持“ <”。

我确定错误所在: 0.000000,icmp ,, 60,60.0,0 字段“ State”为空的文件。

我只想忽略一个热编码,并按原样复制“状态”字段,该字段为空并跳至下一行。

df = opendataset()

df['State2'] = df['State']
df['Proto2'] = df['Proto']
df['Dur'] = df.Dur.apply(lambda n: '%.6f' % n)

le = LabelEncoder()
dfle = df
dfle.State = le.fit_transform(dfle.State)
X = dfle[['State']].values
Y = dfle[['Proto']].values
ohe = OneHotEncoder()
OnehotX = ohe.fit_transform(X).toarray()
OnehotY = ohe.fit_transform(Y).toarray()

dx = pd.DataFrame(data=OnehotX)
dy = pd.DataFrame(data=OnehotY)

dfle['State'] = (dx[dx.columns[0:]].apply(lambda x:''.join(x.dropna().astype(int).astype(str)), axis=1))
dfle['Proto'] = (dy[dy.columns[0:]].apply(lambda y:''.join(y.dropna().astype(int).astype(str)), axis=1))

enter image description here

08-03修改

当我运行上面的代码时,这(下面)是TraceBack。如您所见,错误是dfle.State = le.fit_transform(dfle.State),因此是OnehotX = ohe.fit_transform(X).toarray()。

  

回溯(最近通话最近一次):

     

文件   “ C:/用户/V/PycharmProjects/PreProcess/testfile.py”,   第39行,在dfle.State = le.fit_transform(dfle.State)

     

文件   “ C:\ Users \ V \ PycharmProjects \ PreProcess \ venv \ lib \ site-packages \ sklearn \ preprocessing \ label.py”,   第236行,在fit_transform self.classes_中,y = _encode(y,encode = True)

     

文件   “ C:\ Users \ V \ PycharmProjects \ PreProcess \ venv \ lib \ site-packages \ sklearn \ preprocessing \ label.py”,   第108行,以_encode返回_encode_python(值,唯一性,编码)

     

文件   “ C:\ Users \ V \ PycharmProjects \ PreProcess \ venv \ lib \ site-packages \ sklearn \ preprocessing \ label.py”,   >第63行,在_encode_python uniques = sorted(set(values))

     

TypeError:“ str”和“ float”的实例之间不支持“ <”

新代码: 我试图按照Hemerson Tacon所说的做,并在回溯引发错误的部分上应用Try / Exception,但是它警告我它有错误并引发另一个错误。

le = LabelEncoder()
dfle = df

try:
    dfle.State = le.fit_transform(dfle.State)
except TypeError:
    pass
X = dfle[['State']].values
Y = dfle[['Proto']].values
ohe = OneHotEncoder()
try:
    OnehotX = ohe.fit_transform(X).toarray()
except ValueError:
    pass

OnehotY = ohe.fit_transform(Y).toarray()

dx = pd.DataFrame(data=OnehotX)
dy = pd.DataFrame(data=OnehotY)

dfle['State'] = (dx[dx.columns[0:]].apply(lambda x:''.join(x.dropna().astype(int).astype(str)), axis=1))
dfle['Proto'] = (dy[dy.columns[0:]].apply(lambda y:''.join(y.dropna().astype(int).astype(str)), axis=1))

新错误:

  

回溯(最近通话最近):文件   “ C:/用户/V/PycharmProjects/PreProcess/testfile.py”,   第53行,位于      ** dx = pd.DataFrame(data = OnehotX)NameError:名称'OnehotX'未定义**

最后编辑09/03

该问题的解决方案是将 df.replace()行添加到代码中。因此,当它读取时,用NaN代替空这个词来解决问题。

  

dfle ['State']。replace(np.nan,“空”,inplace = True)

df = opendataset()

df['State2'] = df['State']
df['Proto2'] = df['Proto']
df['Dur'] = df.Dur.apply(lambda n: '%.6f' % n)

le = LabelEncoder()
dfle = df

dfle['State'].replace(np.nan,"empty", inplace=True)

dfle.State = le.fit_transform(dfle.State)

X = dfle[['State']].values
Y = dfle[['Proto']].values
ohe = OneHotEncoder()

OnehotX = ohe.fit_transform(X).toarray()
OnehotY = ohe.fit_transform(Y).toarray()

dx = pd.DataFrame(data=OnehotX)
dy = pd.DataFrame(data=OnehotY)

1 个答案:

答案 0 :(得分:1)

您可以将有问题的代码放在try块中,并捕获TypeError异常,检查是否是State字段为空的情况,如果为true则按您所说忽略它,以及不正确,再次引发错误。

如果您已在数据中发布了实际调用代码OneHotEncoding的代码,将更容易回答您并在答案中提供一些代码。

修改

OnehotX变量仅在try块内定义。您需要在此块之外和之前定义它以修复错误。像OnehotX = None这样的东西会起作用。另外,我还是重申我之前在except块中所说的话,这是一种很好的做法,可以测试异常是否是由于您已经确定的问题引起的,这意味着测试State字段是否为空。