эквивалент панды для кодировки Stata

Я ищу способ репликации поведения кодировки в Stata, который преобразует категориальный столбец строки в столбец чисел.

x = pd.DataFrame({'cat':['A','A','B'], 'val':[10,20,30]}) x = x.set_index('cat') 

Результат:

  val cat A 10 A 20 B 30 

Я хотел бы преобразовать столбец cat из строк в целые числа, сопоставляя каждую уникальную строку с (произвольным) целым числом от 1 до 1. Это приведет к:

  val cat 1 10 1 20 2 30 

Или, как хорошо:

  cat val 0 1 10 1 1 20 2 2 30 

Какие-либо предложения?

Большое спасибо, как всегда, Роб

3 Solutions collect form web for “эквивалент панды для кодировки Stata”

Команда encode Stata начинается с строковой переменной и создает новую целочисленную переменную с метками, сопоставленными с исходной строковой переменной. Прямым аналогом этого в пандах стал бы категорический тип переменной, который стал полноценной частью панд начиная с 0,15 (который был выпущен после того, как этот вопрос изначально был задан и ответил).

См. Документацию здесь .

Чтобы продемонстрировать этот пример, команда Stata будет выглядеть примерно так:

 encode cat, generate(cat2) 

тогда как команда pandas будет:

 x['cat2'] = x['cat'].astype('category') cat val cat2 0 A 10 A 1 A 20 A 2 B 30 B 

Как и Stata с encode , данные хранятся как целые числа, но отображаются в виде строк в выводе по умолчанию.

Вы можете проверить это, используя категорический cat для доступа, чтобы увидеть базовое целое число. (И по этой причине вы, вероятно, не хотите использовать «cat» в качестве имени столбца.)

 x['cat2'].cat.codes 0 0 1 0 2 1 

Вы можете использовать pd.factorize :

 import pandas as pd x = pd.DataFrame({'cat':('A','A','B'), 'val':(10,20,30)}) labels, levels = pd.factorize(x['cat']) x['cat'] = labels x = x.set_index('cat') print(x) 

доходность

  val cat 0 10 0 20 1 30 

Вы можете добавить 1 к labels если хотите воспроизвести поведение Stata:

 x['cat'] = labels+1 

Предполагая, что у вас есть фиксированный набор заглавных английских букв как ваша категориальная переменная, вы также можете сделать это:

 x['cat'] = x.cat.map(lambda x: ord(x) - 64) 

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

 my_map = {"A":1, ...} # eg: {x:ord(x)-64 for x in string.ascii_uppercase} # if that's the convention you happen to desire. 

и затем

 x['cat'] = x.cat.map(lambda x: my_map[x]) 

или что-то подобное.

Это выше, чем использование встроенных функций для целочисленного отображения по многим причинам, и (IMO), это такие вещи, которые «чувствуют себя», как «неприятные преобразования» программисту-аналитику, но на самом деле представляют собой важные метаданные о программном обеспечении, которое вы пишете, которые раскрывают реальную слабость глобальных функций удобства на языках более высокого уровня, таких как MATLAB, STATA и т. д. Даже если есть встроенная функция, которая случайно используется для конкретного соглашения, которое вы хотите использовать ( произвольное соглашение о том, что «A» сопоставляется с 1, «B» отображается на 2 и т. д.), не рекомендуется использовать его.

  • Запустите файл Stata do из Python
  • Преобразование файлов .CSV в файлы .DTA в Python
  • Pandas read_stata () с большими .dta-файлами
  • Python - лучший язык программирования в мире.