Как определить атрибут экземпляра в подклассе DataFrame pandas? - PullRequest
0 голосов
/ 27 января 2019

Я подклассифицирую pandas DataFrame и хочу иметь атрибут.

class MyFrame(pd.DataFrame):


    _metadata = ['myattr']
    myattr = []


    def __init__(self, *args, **kwargs):
        pd.DataFrame.__init__(self, *args, **kwargs)

        self.myattr.append(0)


    @property
    def _constructor(self):
        return AutoData

Моя проблема в том, что myattr является атрибутом класса.Когда я изменяю его в экземпляре моего класса, все экземпляры модифицируются:

mf2 = mf
mf2.myattr.append(1)
print(mf.myattr)
>>> [0, 1]

Но я хочу, чтобы атрибут был связан с его экземпляром.Другими словами, измените myattr только для mf2, но не для mf.Спасибо.

1 Ответ

0 голосов
/ 22 марта 2019

Присвоение атрибутов экземпляра подклассу pd.DataFrame может быть выполнено следующим образом:

class MyFrame(pd.DataFrame):
    _metadata = ['myattr']

    def __init__(self, *args, **kwargs):
        pd.DataFrame.__init__(self, *args, **kwargs)
        self.myattr = [0]

    @property
    def _constructor(self):
        return MyFrame

Список _metadata устанавливает атрибуты, которые не следует рассматривать как столбцы. Имена, перечисленные в _metadata, учитываются в методах __setattr__() и __getattr__() родительского класса pd.DataFrame (то есть NDFrame) и устанавливаются в качестве атрибутов объекта без вызова UserWarning .

Хотя _metadata являются обычными свойствами, также есть возможность установить временные свойства с помощью _internal_names, как описано в документации pandas . Временные свойства не сохраняются после модификаций кадров данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...