我想做一些函数来使用 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")])