У меня был код, который работал нормально, пока я не попытался запустить его на компьютере коллеги, после чего я обнаружил, что, хотя он работал с пандами 0.22.0, он ломался на пандах 0.24.0. На данный момент, мы решили эту проблему путем понижения их копии панд, но я хотел бы найти лучшее решение, если оно существует.
Кажется, проблема в том, что я создаю пользовательский класс для использования в качестве идентификаторов для моих столбцов в кадре данных. При попытке сравнить два фрейма данных он почему-то пытается вызвать метки моих столбцов как функции, а затем выдает исключение, потому что они не могут быть вызваны
Вот пример кода:
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-packages\pandas\core\ops.py", line 2098, in f
return dispatch_to_series(self, other, func, str_rep)
File "C:\...\site-packages\pandas\core\ops.py", line 1157, in dispatch_to_series
new_data = expressions.evaluate(column_op, str_rep, left, right)
File "C:\...\site-packages\pandas\core\computation\expressions.py", line 208, in evaluate
return _evaluate(op, op_str, a, b, **eval_kwargs)
File "C:\...\site-packages\pandas\core\computation\expressions.py", line 68, in _evaluate_standard
return op(a, b)
File "C:\...\site-packages\pandas\core\ops.py", line 1135, in column_op
for i in range(len(a.columns))}
File "C:\...\site-packages\pandas\core\ops.py", line 1135, in <dictcomp>
for i in range(len(a.columns))}
File "C:\...\site-packages\pandas\core\ops.py", line 1739, in wrapper
name=res_name).rename(res_name)
File "C:\...\site-packages\pandas\core\series.py", line 3733, in rename
return super(Series, self).rename(index=index, **kwargs)
File "C:\...\site-packages\pandas\core\generic.py", line 1091, in rename
level=level)
File "C:\...\site-packages\pandas\core\internals\managers.py", line 171, in rename_axis
obj.set_axis(axis, _transform_index(self.axes[axis], mapper, level))
File "C:\...\site-packages\pandas\core\internals\managers.py", line 2004, in _transform_index
items = [func(x) for x in index]
TypeError: 'label' object is not callable
Я обнаружил, что могу решить эту проблему, сделав свой класс вызываемым с помощью одного аргумента и возвращая этот аргумент, но это нарушает индексацию .loc, которая по умолчанию будет обрабатывать мои объекты как вызываемые.
Эта проблема возникает только тогда, когда пользовательские объекты находятся в столбцах - индекс может обрабатывать их очень хорошо.
Это ошибка или изменение в использовании, и есть ли способ, которым я могу обойти это, не отказываясь от своих пользовательских ярлыков?