Ошибка OneHotEncoding при применении к пустому полю - PullRequest
1 голос
/ 08 марта 2019

Код состоит из применения метода OneHotEncoding к двум полям файла binetflow: Прото и Состояние .Я должен сделать это до 5 файлов.Я смог применить приведенный ниже код с совершенством к первым двум.Когда он достигает третьего, он выдает ошибку:

TypeError: '<' не поддерживается между экземплярами 'str' и 'float'. </strong>

Я уверен, что ошибка в строке: 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-03Edit

Это (ниже) TraceBack, когда я запускаю код выше.Как видите, ошибка dfle.State = le.fit_transform (dfle.State) и, следовательно, OnehotX = ohe.fit_transform (X) .toarray ().

Traceback (последний вызов последний):

Файл "C: /Users/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' </strong>

НОВЫЙ КОД: Я попытался сделать то, что сказал Хемерсон Такон, и применил 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: /Users/V/PycharmProjects/PreProcess/testfile.py", строка 53, в ** dx = pd.DataFrame (data = OnehotX) NameError: имя 'OnehotX' не определено **

LAST EDIT 09/03

Решение проблемыбыло просто добавить строку df.replace () к коду.Поэтому, когда он читает, он заменяет NaN на слово пустое, решая проблему.

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)

1 Ответ

1 голос
/ 08 марта 2019

Вы можете поместить свой код в вопросе внутри блока try и перехватить исключение TypeError, проверить, является ли поле State пустым, и если true, игнорировать его, как вы сказали, и, если не true, поднятьснова ошибка.

Если бы вы опубликовали действительный код, который вызывает OneHotEncoding к вашим данным, вам было бы легче ответить и предоставить некоторый код в ответе.

Редактировать

Переменная OnehotX определяется только внутри блока try.Вам нужно определить его снаружи и перед этим блоком, чтобы исправить ошибку.Что-то вроде OnehotX = None будет работать.Кроме того, я подчеркиваю сказанное выше, в блоке except было бы неплохо проверить, является ли исключение причиной обнаруженной вами проблемы, это означает, что поле State является пустым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...