ошибка pandas ValueError: невозможно установить элемент в категории с новой категорией, сначала установите категории

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

Теперь я изменяю информацию внутри фрейма данных, заменяя Yes на 1 и No на 0. Раньше мой код работал нормально, и теперь я внес некоторые изменения из-за проблемы с памятью.

Предыдущий код «Получил ошибку обратной трассировки, указанную ниже»

 df.loc[df[df.decision == 'Yes'].index, 'decision'] = 1
df.loc[df[df.decision == 'No'].index, 'decision'] = 0
 

Изменено с помощью

 df.loc['Yes', "decision"] = 1
df.loc['No', "decision"] = 0
 

Тем не менее, проблема остается той же.

Трассировка

 Traceback (most recent call last):
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/pydev/pydevd.py", line 1477, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/snap/pycharm-community/226/plugins/python-ce/helpers/pydev/_pydev_imps/_pydev_execfile.py", line 18, in execfile
    exec(compile(contents "n", file, 'exec'), glob, loc)
  File "/home/khawar/deepface/tests/Ensemble-Face-Recognition.py", line 148, in <module>
    df.loc['Yes', "decision"] = 1
  File "/home/khawar/.local/lib/python3.6/site-packages/pandas/core/indexing.py", line 670, in __setitem__
    iloc._setitem_with_indexer(indexer, value)
  File "/home/khawar/.local/lib/python3.6/site-packages/pandas/core/indexing.py", line 1763, in _setitem_with_indexer
    isetter(loc, value)
  File "/home/khawar/.local/lib/python3.6/site-packages/pandas/core/indexing.py", line 1689, in isetter
    ser._mgr = ser._mgr.setitem(indexer=plane_indexer, value=v)
  File "/home/khawar/.local/lib/python3.6/site-packages/pandas/core/internals/managers.py", line 543, in setitem
    return self.apply("setitem", indexer=indexer, value=value)
  File "/home/khawar/.local/lib/python3.6/site-packages/pandas/core/internals/managers.py", line 409, in apply
    applied = getattr(b, f)(**kwargs)
  File "/home/khawar/.local/lib/python3.6/site-packages/pandas/core/internals/blocks.py", line 1688, in setitem
    self.values[indexer] = value
  File "/home/khawar/.local/lib/python3.6/site-packages/pandas/core/arrays/categorical.py", line 2011, in __setitem__
    "Cannot setitem on a Categorical with a new "
ValueError: Cannot setitem on a Categorical with a new category, set the categories first
python-BaseException
 

Как и было предложено, я внедрил новый код

 df['decision'] = (df['decision'] == 'Yes').astype(int)
 

Трассировка

 Traceback (most recent call last):
  File "/home/khawar/deepface/tests/Ensemble-Face-Recognition.py", line 174, in <module>
    gbm = lgb.train(params, lgb_train, num_boost_round=1000, early_stopping_rounds=15, valid_sets=lgb_test)
  File "/home/khawar/.local/lib/python3.6/site-packages/lightgbm/engine.py", line 231, in train
    booster = Booster(params=params, train_set=train_set)
  File "/home/khawar/.local/lib/python3.6/site-packages/lightgbm/basic.py", line 2053, in __init__
    train_set.construct()
  File "/home/khawar/.local/lib/python3.6/site-packages/lightgbm/basic.py", line 1325, in construct
    categorical_feature=self.categorical_feature, params=self.params)
  File "/home/khawar/.local/lib/python3.6/site-packages/lightgbm/basic.py", line 1123, in _lazy_init
    self.__init_from_np2d(data, params_str, ref_dataset)
  File "/home/khawar/.local/lib/python3.6/site-packages/lightgbm/basic.py", line 1162, in __init_from_np2d
    data = np.array(mat.reshape(mat.size), dtype=np.float32)
ValueError: could not convert string to float: 'deepface/tests/dataset/029A33.JPG'
 

Комментарии:

1. Не могли бы вы попробовать следующее : df['decision'] = (df['decision'] == 'Yes').astype(int) . Это должно работать для двоичной категориальной переменной

2. Я написал выше строку и теперь получаю сообщение об ошибке преобразования типа данных

Ответ №1:

В вашем решении есть проблема с categorical столбцом, поэтому, если заменить только некоторые строки, pandas хочет, чтобы для столбца вывода были установлены категории, и поскольку 0,1 в категориях не существует, возникает ошибка.

Образец данных с категориальным столбцом:

 df = pd.DataFrame({'decision':['Yes','No']})

df['decision'] = pd.Categorical(df['decision'])
 

Решения с Series.map cat.rename_categories категориальным выводом и для него:

 df['decision1'] = df['decision'].map({'Yes':1, 'No':0})
df['decision2'] = df['decision'].cat.rename_categories({'Yes':1, 'No':0})
 

Если возможно только Yes No значение и, воссоздайте все значения путем сравнения по Yes и приведения к целому числу для True, False 1,0 сопоставления с, как указано @arhr, категория теряется:

 df['decision3'] = (df['decision'] == 'Yes').astype(int)
print (df)
  decision decision1  decision2 decision3
0      Yes         1          1         1
1       No         0          0         0

print (df.dtypes)
decision     category
decision1    category
decision2    category  
decision3       int32
dtype: object