pandas-dev / pandas

Flexible and powerful data analysis / manipulation library for Python, providing labeled data structures similar to R data.frame objects, statistical functions, and much more
https://pandas.pydata.org
BSD 3-Clause "New" or "Revised" License
44.39k stars 18.16k forks source link

ENH: add `__rshift__`, `__lshift__`, `__irshift__` and `__ilshift__` #60693

Open luxedo opened 1 week ago

luxedo commented 1 week ago

Feature Type

Problem Description

Pandas has many in-place operators implemented:

__iadd__,  __isub__,  __imul__,  __itruediv_ __ifloordiv __imod__,  __ipow__,  __iand__,  __ixor__,  __ior__, __imatmul__

As for __rshift__, __lshift__, __irshift__ and __ilshift__ they don't work in version 2.2.2.

>>> import pandas as pd
>>> s = pd.Series([0, 1, 2])
>>> s <<= 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for <<=: 'Series' and 'int'

And numpy implements all methods:

>>> import numpy as np 
>>> s = np.array([0, 1, 2])
>>> s <<= 3
>>> s
array([ 0,  8, 16])

Feature Description

Allow for __rshift__, __lshift__, __irshift__ and __ilshift__ calls in Series and DataFrames

>>> import pandas as pd 
>>> s = pd.Series([0, 1, 2])
>>> s << 3
0    0
1    8
2    16
>>> s <<= 3
>>> s
0    0
1    8
2    16

Alternative Solutions

For now, the solution is to create a new Series operating over the underlying numpy array

>>> pd.Series(s.values << 3)
0     0
1     8
2    16
dtype: int64

Additional Context

It is curious that the last issue that talks about shift operations is from more than 10 years ago (https://github.com/pandas-dev/pandas/pull/2337). Indeed it's quite a niche feature and fits more computer scientists rather than data scientists. Anyway, I thought about this feature more for completeness and consistency with python operators rather than usefulness.

luxedo commented 1 week ago

If that's a desired feature I'd be glad to add a PR for it