Ответ 1
Просмотр всей трассировки для сравнения серий с несовпадающими индексами, особенно с учетом сообщения об исключении:
In [1]: import pandas as pd
In [2]: x = pd.Series([1, 2, 3], index=list('abc'))
In [3]: y = pd.Series([2, 3, 3], index=list('bca'))
In [4]: x == y
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-4-73b2790c1e5e> in <module>()
----> 1 x == y
/usr/lib/python3.7/site-packages/pandas/core/ops.py in wrapper(self, other, axis)
1188
1189 elif isinstance(other, ABCSeries) and not self._indexed_same(othe
r):
-> 1190 raise ValueError("Can only compare identically-labeled "
1191 "Series objects")
1192
ValueError: Can only compare identically-labeled Series objects
мы видим, что это намеренное решение о реализации. Кроме того, это не уникально для объектов Series - DataFrames вызывают аналогичную ошибку.
Копание в Git обвинений в соответствующих строках в конечном итоге приводит к появлению некоторых соответствующих коммитов и выдаче потоков трекера. Например, Series.__eq__
использовался для полного игнорирования индекса RHS, и в комментарии к сообщению об ошибке такого поведения автор Pandas Уэс МакКинни говорит следующее:
Это на самом деле особенность/намеренный выбор, а не bug--, это связано с # 652. Еще в январе я изменил методы сравнения для автоматического выравнивания, но обнаружил, что это приводит к большому количеству ошибок/поломок для пользователей и, в частности, многих функций NumPy (которые регулярно выполняют такие функции, как
arr[1:] == arr[:-1]
; пример:np.unique
) перестал работать.Это возвращает нас к вопросу о том, что Series не достаточно похож на ndarray и, вероятно, не должен быть подклассом ndarray.
Итак, у меня нет хорошего ответа для вас, кроме этого; автоматическое выравнивание было бы идеальным, но я не думаю, что смогу сделать это, если я не сделаю Series не подклассом ndarray. Я думаю, что это, вероятно, хорошая идея, но вряд ли произойдет до 0,9 или 0,10 (несколько месяцев спустя).
Затем это было изменено на текущее поведение в пандах 0.19.0. Цитируя страницу "что нового":
Операторы следующих серий были изменены, чтобы сделать все операторы согласованными, включая DataFrame (GH1134, GH4581, GH13538)
- Операторы сравнения серий теперь вызывают ValueError, когда индексы отличаются.
- Последовательные логические операторы выравнивают как индекс левой, так и правой стороны.
Это привело к тому, что поведение Series соответствовало поведению DataFrame, которое уже отклоняло несоответствующие индексы в сравнениях.
Таким образом, автоматическое выравнивание индексов операторов сравнения оказалось слишком сложным, поэтому это была лучшая альтернатива.