Pandas 0.24.0 разбивает мой фрейм данных pandas специальными идентификаторами столбцов

#pandas #python-2.7 #dataframe

#pandas #python-2.7 #фрейм данных

Вопрос:

У меня был код, который работал нормально, пока я не попытался запустить его на компьютере коллеги, после чего я обнаружил, что, хотя он работал с использованием pandas 0.22.0, он сломался на pandas 0.24.0. На данный момент мы решили эту проблему, понизив рейтинг их копии pandas, но я хотел бы найти лучшее решение, если таковое существует.

Проблема, похоже, в том, что я создаю пользовательский класс для использования в качестве идентификаторов для моих столбцов в фрейме данных. При попытке сравнить два фрейма данных он по какой-то причине пытается вызвать мои метки столбцов как функции, а затем выдает исключение, потому что они не могут быть вызваны

Вот несколько примеров кода:

 import pandas as pd
import numpy as np

class label(object):
    def __init__(self, var):
        self.var = var
    def __eq__(self,other):
        return self.var == other.var

df = pd.DataFrame(np.eye(5),columns=[label(ii) for ii in range(5)])
df == df
  

Это приводит к следующей трассировке стека:

 Traceback (most recent call last):

  File "<ipython-input-4-496e4ab3f9d9>", line 1, in <module>
    df==df1

  File "C:...site-packagespandascoreops.py", line 2098, in f
    return dispatch_to_series(self, other, func, str_rep)

  File "C:...site-packagespandascoreops.py", line 1157, in dispatch_to_series
    new_data = expressions.evaluate(column_op, str_rep, left, right)

  File "C:...site-packagespandascorecomputationexpressions.py", line 208, in evaluate
    return _evaluate(op, op_str, a, b, **eval_kwargs)

  File "C:...site-packagespandascorecomputationexpressions.py", line 68, in _evaluate_standard
    return op(a, b)

  File "C:...site-packagespandascoreops.py", line 1135, in column_op
    for i in range(len(a.columns))}

  File "C:...site-packagespandascoreops.py", line 1135, in <dictcomp>
    for i in range(len(a.columns))}

  File "C:...site-packagespandascoreops.py", line 1739, in wrapper
    name=res_name).rename(res_name)

  File "C:...site-packagespandascoreseries.py", line 3733, in rename
    return super(Series, self).rename(index=index, **kwargs)

  File "C:...site-packagespandascoregeneric.py", line 1091, in rename
    level=level)

  File "C:...site-packagespandascoreinternalsmanagers.py", line 171, in rename_axis
    obj.set_axis(axis, _transform_index(self.axes[axis], mapper, level))

  File "C:...site-packagespandascoreinternalsmanagers.py", line 2004, in _transform_index
    items = [func(x) for x in index]

TypeError: 'label' object is not callable
  

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

Эта проблема возникает только тогда, когда пользовательские объекты находятся в столбцах — индекс может обрабатывать их просто отлично.

Это ошибка или изменение в использовании, и есть ли какой-либо способ обойти это, не отказываясь от своих пользовательских меток?

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

1. Может быть, то же самое, что и эта проблема ? Похоже, что что-то было изменено в 0.23