如何使用 python reduce 函数来填充 NaN 值

How do I use python reduce function to fill NaN values

我有一个数据框,其中有几列缺少数据。在其中一些列中,说 'Col_A' 到 'Col_D',我想用 0 替换它们。我这样试过:

reduce(lambda x : df.fillna({x : 0}, inplace=True), ['Col_A', 'Col_B', 'Col_C', 'Col_D'])

但我收到错误消息 <lambda>() takes 1 positional argument but 2 were given。最终,我将解决方案更改为简单

df[['Col_A', 'Col_B', 'Col_C', 'Col_D']] = df[['Col_A', 'Col_B', 'Col_C', 'Col_D']].fillna(0)

但我仍然想知道我之前尝试的解决方案有什么问题。

如评论中所述,这是一种相当奇怪的实现目标的方式,存在多个问题,违反了良好的编程习惯

所以从免责声明开始:我不建议这样做,但我只是回答有关函数行为的问题。

取消免责声明后,可以通过两个小的更改来工作。以下应该有效

reduce(lambda _, x : df.fillna({x : 0}, inplace=True), ['Col_A', 'Col_B', 'Col_C', 'Col_D'], 'fake')

首先请注意,根据 reduce 函数的要求,我们使 lambda 接受两个参数。第一个参数是在上一步应用该函数的结果。在这里,由于我们并不真正关心上一步函数的应用结果,而是依赖 reduce 对全局(减少函数)变量 df 的副作用——这作为这种方法的主要问题——我们将其设为未命名参数 _。其次,我们需要一个起点 - 所谓的初始化器 - reduce 才能工作,因为它将使用此值和列表的第一个值调用 lambda 函数,作为第一步。如果我们像你一样省略初始化器,它将从列表的前两个值开始,因此基本上缺少 Col_Afillna。因此,因此,我们有一个 'fake' 初始化程序传递给 reduce 函数(如果不清楚,您可以随意调用它)