Я пытаюсь скопировать, dplyr пакет из R, используя Python/Pandas (в качестве учебного упражнения). То, что я застрял, это функциональность "трубопроводов".
В R/dplyr это выполняется с использованием оператора-оператора %>%
, где x %>% f(y)
эквивалентно f(x, y)
. Если возможно, я хотел бы воспроизвести это с помощью синтаксиса infix (см. здесь).
Чтобы проиллюстрировать, рассмотрим две функции ниже.
import pandas as pd
def select(df, *args):
cols = [x for x in args]
df = df[cols]
return df
def rename(df, **kwargs):
for name, value in kwargs.items():
df = df.rename(columns={'%s' % name: '%s' % value})
return df
Первая функция принимает фрейм данных и возвращает только данные столбцы. Второй принимает блок данных и переименовывает данные столбцы. Например:
d = {'one' : [1., 2., 3., 4., 4.],
'two' : [4., 3., 2., 1., 3.]}
df = pd.DataFrame(d)
# Keep only the 'one' column.
df = select(df, 'one')
# Rename the 'one' column to 'new_one'.
df = rename(df, one = 'new_one')
Для достижения такого же синтаксиса pipe/infix код будет выглядеть следующим образом:
df = df | select('one') \
| rename(one = 'new_one')
Таким образом, выход из левой части |
передается в качестве первого аргумента функции справа. Всякий раз, когда я вижу что-то подобное (здесь), он включает функции лямбда-функции. Возможно ли передать трубку Pandas 'между функциями таким же образом?
Я знаю, что Pandas имеет метод .pipe
, но для меня важным является синтаксис примера, который я предоставил. Любая помощь будет оценена по достоинству.