Объединение категорий: как обрабатывать дубликаты - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу объединить категориальное сопоставление из нескольких серий, чтобы переназначить это объединение этим сериям в качестве их категориального сопоставления.Однако pd.api.types.union_categoricals не объединяет дубликаты переданных ему категорий.Как вы должны объединить категории , а объединить дубликаты?

Рассмотрите этот фрагмент:

import pandas as pd

ac = pd.Categorical(['a1','a2', 'b1'])
bc = pd.Categorical(['b1','b2', 'a1'])

af = pd.DataFrame(pd.Series(ac, dtype="category", name='a'))
bf = pd.DataFrame(pd.Series(bc, dtype="category", name='b'))

all_categories = pd.api.types.union_categoricals([ac, bc])

print(all_categories)

af.a = af.a.cat.set_categories(all_categories)
bf.b = bf.b.cat.set_categories(all_categories)

df = af.join(bf)

Для оператора print я получаю

[a1, a2, b1, b1, b2, a1]
Categories (4, object): [a1, a2, b1, b2]

Строка af.a = af.a.cat.set_categories(all_categories) дает мне ошибку ValueError: Categorical categories must be unique.

Хорошо ... тогда как мне это сделать, если объединение нелогичным образом не выполняет фактическое объединение, подобное множеству, которое объединяет дубликаты?

Повторюсь: я намерен af.a и bf.b использовать одно и то же категориальное отображение.Для этого я сначала хочу объединить их сопоставления и заменить исходные сопоставления серии объединенными сопоставлениями.Код работает, когда all_categories не содержит дубликатов.

1 Ответ

0 голосов
/ 26 ноября 2018

Следующее работает, но выглядит как обходной путь и не очень элегантно:

import pandas as pd

ac = pd.Categorical(['a1','a2', 'b1'])
bc = pd.Categorical(['b1','b2', 'a1'])

af = pd.DataFrame(pd.Series(ac, dtype="category", name='a'))
bf = pd.DataFrame(pd.Series(bc, dtype="category", name='b'))

all_categories = pd.Series(pd.api.types.union_categoricals([ac, bc]))
all_categories.drop_duplicates()

af.a = af.a.cat.set_categories(all_categories.cat.categories)
bf.b = bf.b.cat.set_categories(all_categories.cat.categories)
...