我经常想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
**。
display
我的问题是关于我想用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_, plt.ecdf(df_.new_column), display(df_), ...)
#...further chaining is possible
)
问题
是否有一种完全在线的方式可以做到这一点,而不需要定义transparent_pipe
?
最好只使用pandas
。
*来自《Effective Pandas 2:数据操作的固执模式》的提示,M. Harrison,2024 年。
**由于计算结果为 ,因此该.pipe
运算返回。df_
display(df_) or df_
None or df_
df_
通过
pyjanitor
,您可以使用also
:或者,使用包装函数隐藏任何函数的输出并将其替换为其第一个参数(= DataFrame):
或者,像原来的方法一样采用短路:
或者用元组强制得出真值:
list
您也可以在操作内部编写一个.pipe()
,然后从该列表中提取数据框:.pipe(lambda x: [x, funcA(x), funcB(x), ...][0])
这使得您可以在线定义和运行任意操作,同时还确保修改后的数据框将被传播。
我选择了@mozway 的答案而不是这个答案,尽管它们非常相似。
@mozway 的第四个建议是:
我更喜欢它,因为不需要索引数据框,它会通过真实性评估自动返回。