#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
, что приводит к другой форме, наблюдаемой в опубликованном вопросе.