Серия pandas с подклассом Slice возвращает полные данные при применении пользовательского метода

#python #python-3.x #pandas #slice #subclass

#python #python-3.x #pandas #срез #подкласс

Вопрос:

Поэтому по какой-то причине я хочу подкласс pandas.Серия, подобная этой:

 class _Subseries(pd.Series):
   
   _metadata = ['custom_method']
   
   @property
   def _constructor(self):
       return _Subseries
   
   @property
   def _constructor_expanddim(self):
       return _Subseries
   
   def custom_method(self, value):
       return self.values   value
 

Я создаю экземпляр, разрезаю его и проверяю, что тип не изменился:

 s = _Subseries(range(5))
s = s[-3:]
print(s.values, type(s[-2:]))
 

[2 3 4] <класс ‘main._Subseries’>

Пока все хорошо. Кажется, что серия нарезана так, как должна, и тип остался неизменным.

Теперь, если я хочу применить какой-либо метод к этому объекту, он будет применять его не к нарезанной версии, а к исходной:

 s.custom_method(1)
 

массив([1, 2, 3, 4, 5], dtype=int64)

Вопросы:

  • Это нормальное поведение?
  • Если нет, то как я могу подклассировать pandas.Серия, разрежьте ее, примените к ней метод и заставьте его возвращать результат этого метода для нарезанных данных (вместо исходных данных, как в данном случае), без изменения типа?

Дополнительная информация:

  • pandas 1.1.3
  • python 3.7.9

Ответ №1:

Решение:

_metadata Для доступа, например, после нарезки, необходимо определить только атрибуты. Удаление custom_method из _metadata вернет ожидаемый результат при выполнении s.custom_method(1) :

массив ([3, 4, 5], dtype=int64)

Объяснение:

Атрибуты, определенные в _metadata , копируются из исходного экземпляра, т. Е. В этом случае s_sliced.custom_method = s.custom_method , что приводит к другой форме, наблюдаемой в опубликованном вопросе.