python - 如何在 python pandas 管道中将函数作为参数传递

我想做一些函数来使用 pandas 的管道。

像这样

import pandas as pd

def foo(df):
   df['A'] = 1
   return df

def goo(df):
   df['B'] = 2
   return df

def hoo(df, arg1):
   df[arg1] = 3
   return df


df = pd.DataFrame.from_dict({"A":[1, 2, 3],
                            "B":[4, 5, 6]})
print(df)

(df.pipe(foo)
  .pipe(goo)
  .pipe(hoo, arg1='Hello')
)

print(df)

第一张印刷品是

A  B
0  1  4
1  2  5
2  3  6

第二个点是

A  B  Hello
0  1  2      3
1  1  2      3
2  1  2      3

这是无意义的代码,易于理解。

函数 sch 有许多组合,如 foo、goo、hoo。我需要抽象这个管道代码。

import pandas as pd

def foo(df):
    df['A'] += 1
    return df

def goo(df):
    df['B'] += 2
    return df

def hoo(df, arg1):
    df[arg1] = 3
    return df


def pipe_line(df, func_list, kargs_list):
    for func, kargs in zip(func_list, kargs_list):
        df = func(df, **kargs)
    return df

df = pd.DataFrame.from_dict({"A":[1, 2, 3],
                             "B":[4, 5, 6]})

df = pipe_line(df, 
    [foo, goo, hoo], 
    [{}, {}, dict(arg1="HELLO")])

print(df)

但是, pipe_line 函数非常难看。如何升级此功能的可读性?

回答1

pipe_line 根本不需要太多:只需重复将函数应用于先前函数的返回 values 直到函数用完。

def pipe_line(df, fs):
    for f in fs:
       df = f(df)
    return df

诀窍是定义适当的函数,它们都采用单个 dataframe 参数。 https://docs.python.org/3/library/functools.html#functools.partial 对此有所帮助。

from functools import partial


df = pipeline(df, [foo, goo, partial(hoo, arg1="HELLO")])

相似文章

最新文章