我经常想在一系列链式操作期间操作和
display
数据帧,为此我将使用*:
df = (
df
#Modify the dataframe:
.assign(new_column=...)
#View result (without killing the chain)
.pipe(lambda df_: display(df_) or df_)
#...further chaining is possible
)
上面的代码块将
new_column
添加到数据帧,在返回之前显示新的数据帧。链接在这里起作用是因为 display
返回 None
,因此 .pipe
将返回 df_
,因为 None or df_
的计算结果为 df_
。
我的问题是关于我想用
display
或某些 not返回
plt.plot
的函数替换 None
的场景。在这种情况下,df_
将不再通过链传播。
我的解决方法是定义一个外部函数
transparent_pipe
,它可以运行plt.plot
或任何其他方法,同时确保数据帧得到传播:
def transparent_pipe(df, *funcs):
[func(df) for func in funcs]
return df
df = (
df
#Modify the dataframe:
.assign(new_column=...)
#Visualise a column from the modified df, without killing the chain
.pipe(lambda df_: transparent_pipe(df_, lambda df_: plt.ecdf(df_.new_column), display(df_), ...)
#...further chaining is possible
)
有没有一种完全内嵌的方式来做到这一点,而不需要定义
transparent_pipe
?
*来自 Effective Pandas 2:数据操作的自以为是的模式的提示,M Harrison (2024)。
您可以在
list
操作中编写 .pipe()
,然后从该列表中提取数据帧:.pipe(lambda df_: [..., df_][-1])
。
df = (
df
#Modify the dataframe:
.assign(new_column=...)
#Various visualisations, without killing the chain
.pipe(lambda df_: [display(df_), lambda df_: plt.ecdf(df_.new_column), ..., df_)[-1]
#...further chaining is possible
)
这允许您在线定义和运行任意操作,同时还确保修改后的数据帧将被传播。