应用于空字段时出现 OneHotEncoding 错误

OneHotEncoding error when applying to an empty field

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

TypeError: '<' not supported between instances of 'str' and 'float'.

我确定错误在行中:0.000000,icmp,60,60.0,0 字段状态为空的文件。

我只想忽略 One hot Encoding 并按原样复制 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))

08-03 编辑

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

Traceback (most recent call last):

File "C:/Users/V/PycharmProjects/PreProcess/testfile.py", line 39, in dfle.State = le.fit_transform(dfle.State)

File "C:\Users\V\PycharmProjects\PreProcess\venv\lib\site-packages\sklearn\preprocessing\label.py", line 236, in fit_transform self.classes_, y = _encode(y, encode=True)

File "C:\Users\V\PycharmProjects\PreProcess\venv\lib\site-packages\sklearn\preprocessing\label.py", line 108, in _encode return _encode_python(values, uniques, encode)

File "C:\Users\V\PycharmProjects\PreProcess\venv\lib\site-packages\sklearn\preprocessing\label.py", > line 63, in _encode_python uniques = sorted(set(values))

TypeError: '<' not supported between instances of 'str' and '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))

新错误:

Traceback (most recent call last): File "C:/Users/V/PycharmProjects/PreProcess/testfile.py", line 53, in ** dx = pd.DataFrame(data=OnehotX) NameError: name 'OnehotX' is not defined**

上次编辑 09/03

问题的解决方案是简单地将行 df.replace() 添加到代码中。因此,当它读取时,它会用 NaN 替换 empty 一词来解决问题。

dfle['State'].replace(np.nan,"empty", 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)

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

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

编辑

OnehotX 变量仅在 try 块内定义。您需要在此块之外和之前定义它以修复错误。 OnehotX = None 这样的东西会起作用。另外,我强调我之前说过的话,在 except 块中测试异常是否是由于您确定的问题引起的,这意味着测试 State 字段是否为空。