Pandas категорических данных: хранение преобразования - PullRequest
0 голосов
/ 28 июня 2018

Скажите, у меня есть следующий фрейм данных.

df = pd.DataFrame({'col1':[1,2,3,4,5], 'col2':list('abcab'),  'col3':list('ababb')})

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

df['col2'] = df['col2'].astype('category')
df['col3'] = df['col3'].astype('category')
cat_columns = df.select_dtypes(['category']).columns
df[cat_columns] = df[cat_columns].apply(lambda x: x.cat.codes)

В конце этого преобразования, когда я печатаю (df.dtypes), я получаю

col1    int64
col2     int8
col3     int8

Вся категориальная информация отсутствует. Могу ли я сохранить сопоставление категории с целым числом в файле? Я хочу иметь возможность программно инвертировать преобразование на фрейме данных в будущем.

РЕДАКТИРОВАТЬ: Я ищу обратимый процесс. Таким образом, это означает сохранение в реальном файле преобразований для всех категориальных столбцов. Когда-нибудь в будущем я захочу получить любые результаты, которые у меня есть, когда столбцы будут иметь то же имя, что и исходный кадр данных, выполнить обратное преобразование с использованием сохраненной информации и получить результаты в виде категориальных данных.

1 Ответ

0 голосов
/ 28 июня 2018

Вы можете использовать несколько вложенных словарных понятий для хранения ваших отображений в обоих направлениях для всех столбцов категории. Если вам нужно хранить их внешне, вы можете использовать pickle.

cat_cols = df.select_dtypes(['category']).columns

cat_to_code = {col: dict(zip(df[col], df[col].cat.codes)) \
               for col in cat_cols}
# {'col2': {'a': 0, 'b': 1, 'c': 2}, 'col3': {'a': 0, 'b': 1}}

code_to_cat = {k: {v2: k2 for k2, v2 in v.items()} \
               for k, v in cat_to_code.items()}
# {'col2': {0: 'a', 1: 'b', 2: 'c'}, 'col3': {0: 'a', 1: 'b'}}

df[cat_cols] = df[cat_cols].apply(lambda x: x.cat.codes)

Обратите внимание, что двусторонние инъективные отображения изначально невозможны, вам придется поддерживать 2 отдельных отображения, если вам нужен доступ O (1) в обоих направлениях.

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