应用于空字段时出现 OneHotEncoding 错误
OneHotEncoding error when applying to an empty field
该代码包括将 OneHotEncoding 技术应用于 binetflow 文件的两个字段:Proto 和 State。我必须对 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 字段是否为空。
该代码包括将 OneHotEncoding 技术应用于 binetflow 文件的两个字段:Proto 和 State。我必须对 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 字段是否为空。