如何在pandas中完全内联链式操作?

问题描述 投票:0回答:1

我经常想在一系列链式操作期间操作和

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)。

pandas method-chaining
1个回答
0
投票

您可以在

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
)

这允许您在线定义和运行任意操作,同时还确保修改后的数据帧将被传播。

© www.soinside.com 2019 - 2024. All rights reserved.