如何使用 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_A
到 fillna
。因此,因此,我们有一个 'fake'
初始化程序传递给 reduce
函数(如果不清楚,您可以随意调用它)
我有一个数据框,其中有几列缺少数据。在其中一些列中,说 '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_A
到 fillna
。因此,因此,我们有一个 'fake'
初始化程序传递给 reduce
函数(如果不清楚,您可以随意调用它)