#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