Разделение категориальных переменных в Python

#python #pandas

#python #pandas

Вопрос:

Я в основном читаю фрейм данных в Python, а затем выполняю некоторые базовые исследования данных:

 data = pd.read_csv("S:/<File1.csv>"
data.dtypes
  

Все столбцы считываются как типы объектов, за исключением первого и последнего столбцов. var1 — var7 — это все категориальные переменные со многими уровнями в середине набора данных:

 categorical_features = ['var1','var2','var3',var4','var5','var6','var7'] 
for col in categorical_features: #for each categorical col
    dummies = pd.get_dummies(data[col], prefix=col) #one-hot-encoding
    data = pd.concat([data, dummies], axis=1) #append to data
    data.drop(col, axis=1, inplace=True) #drop orig column
  

Но я получаю ошибки. Я знаю, что код работает, когда мой список категориальных функций содержит все int64, но я не могу этого сделать, поскольку в моих семи переменных много символов.

Ниже приведен список ошибок, которые я получаю:

   File "<ipython-input-20-388dc6340151>", line 2, in <module>
    dummies = pd.get_dummies(data[col], prefix=col) #one-hot-encoding
  File "C:ProgramDataAnaconda3libsite-packagespandascoreframe.py", line 2688, in __getitem__
    return self._getitem_column(key)
  File "C:ProgramDataAnaconda3libsite-packagespandascoreframe.py", line 2695, in _getitem_column
    return self._get_item_cache(key)
  File "C:ProgramDataAnaconda3libsite-packagespandascoregeneric.py", line 2489, in _get_item_cache
    values = self._data.get(item)
  File "C:ProgramDataAnaconda3libsite-packagespandascoreinternals.py", line 4115, in get
    loc = self.items.get_loc(item)
  File "C:ProgramDataAnaconda3libsite-packagespandascoreindexesbase.py", line 3080, in get_loc
    return self._engine.get_loc(self._maybe_cast_indexer(key))
  File "pandas_libsindex.pyx", line 140, in pandas._libs.index.IndexEngine.get_loc
  File "pandas_libsindex.pyx", line 162, in pandas._libs.index.IndexEngine.get_loc
  File "pandas_libshashtable_class_helper.pxi", line 1492, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas_libshashtable_class_helper.pxi", line 1500, in pandas._libs.hashtable.PyObjectHashTable.get_item
  KeyError: 'var1'
  

Ответ №1:

То, что вы делаете, выглядит правильно.

Ошибка, которую вы получаете, возникает, когда именованный столбец не существует во фрейме данных при запуске df['var1' ]. Это не связано с типом данных столбца.

Дважды проверьте, что имена столбцов, загруженных из CSV, точно соответствуют названиям в categorical_features и не содержат начальных или конечных пробелов или других незначительных различий.

Показана третья строка обратной трассировки __getitem__ , которая является частной функцией Python, вызываемой при использовании квадратных скобок для объекта. Это выполняется перед get_dummies() вызовом.

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

1. Это произошло из-за заглавных букв. Пожалуйста, уточните, как новые дихотомизированные столбцы нумеруются / упорядочиваются. Например, var1 имеет 63 различных категории или уровня, и они корректно создают 63 разных столбца. Однако новые столбцы расположены в интересном порядке: var1_1, var1_10, var1_11, var1_13 — в нем пропущено 12. Кроме того, после того, как он достигает var1_99, он создает новые столбцы, такие как var1_A0, var1_A4, var1_A5 и var1_B4. Я не могу понять шаблон — есть ли он?

2. Вероятно, об этом стоит начать новый вопрос. Похоже, что он упорядочивает строки или буквенно-цифровые, а не только по числу, а что касается букв, я не знаю.