Ответ 1
Ну, я могу думать о решении, но есть предостережение: ваша исходная функция не должна принимать второй позиционный аргумент, который является pandas dataframe (аргументы ключевого слова в порядке). Переключает __call__
и добавляет метод __new__
к нашему классу PipeInto
внутри декоратора. Этот новый конструктор проверяет, является ли первый аргумент файловой рамкой, и если это тогда, мы просто вызываем исходную функцию с аргументами:
def __new__(cls, *args, **kwargs):
if args and isinstance(args[0], pd.DataFrame):
return cls.data['function'](*args, **kwargs)
return super().__new__(cls)
Кажется, работает, дайте мне знать, если вы найдете недостаток.
>>> df = pd.DataFrame({'one' : [1., 2., 3., 4., 4.],
'two' : [4., 3., 2., 1., 3.]})
>>> select(df, 'one')
one
0 1.0
1 2.0
2 3.0
3 4.0
4 4.0
>>> df >> select('one')
one
0 1.0
1 2.0
2 3.0
3 4.0
4 4.0