Панды объединяются с категориальными индексами

#python #pandas #categorical-data

Вопрос:

Я получаю неожиданные результаты при попытке объединить DataFrame объекты Pandas с категориальными индексами. Вот минимальный воспроизводимый пример (составленный из моего реального случая использования):

 shape_categories=['square', 'circle']
color_categories=['red', 'blue', 'green']

test_a = pd.DataFrame({
    'shape': pd.Categorical(['square', 'circle'], categories=shape_categories, ordered=True),
    'color': pd.Categorical(['red', 'blue'], categories=color_categories, ordered=True),
    'value_a': [1.0, 2.0]
})
test_a.set_index(['shape', 'color'], inplace=True)

test_b = pd.DataFrame({
    'shape': pd.Categorical(['square', 'square', 'circle', 'circle'], categories=shape_categories, ordered=True),
    'color': pd.Categorical(['red', 'blue', 'red', 'blue'], categories=color_categories, ordered=True),
    'value_b': [10.0, np.nan, np.nan, 40.0]
})
test_b.set_index(['shape', 'color'], inplace=True)

test_a.join(test_b, how='left')
 

Я ожидаю

форма Цвет значение a значение b
площадь красный 1.0 10.0
круг Синий 2.0 40.0

но вместо этого я получаю

форма Цвет значение a значение b
площадь красный 1.0 10.0
круг Синий 2.0 NaN

Что я упускаю? Я старался быть осторожным, чтобы типы dtypes категориальных переменных оставались точно такими же.

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

1. на какой версии вы находитесь? Я работаю на Pandas 1.3.1, и он отлично работает. Возможно, я неправильно понимаю ваш пост, поэтому, пожалуйста, поделитесь своими ожидаемыми результатами

2. Просто отредактировано выше, чтобы было понятнее, что я подозреваю. Я использую pandas v1.1.3. Обновление сейчас, чтобы посмотреть, поможет ли это.

3. Тьфу. Обновление до версии 1.3.3 сделало свое дело. Спасибо.

4. Для потомков, вот отчет об ошибке: github.com/pandas-dev/pandas/issues/38502 Исправлено в версии 1.3

Ответ №1:

Вам нужно указать все индексы для объединения, иначе панды будут использовать только первый. Так что в вашем случае:

 test_a.join(test_b, how='left', on = ['shape', 'color'])
 

должно привести к ожидаемому результату.

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

1. Интересно, что, похоже, явная спецификация индексов соединений необходима в 1.1.3, но не в 1.3.3

2. Для потомков, вот отчет об ошибке: github.com/pandas-dev/pandas/issues/38502 Исправлено в версии 1.3