首页 > 解决方案 > 如何使用 python reduce 函数填充 NaN 值

问题描述

我有一个数据框,其中几列中缺少数据。在其中一些列中,比如“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)

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

标签: pythonpandaslambdafillnafunctools

解决方案


正如评论中所提到的,这是一种相当奇怪的方式来实现您的目标,其中存在多个与良好编程实践背道而驰的问题

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

排除了免责声明,这可以通过两个小改动来实现。以下应该工作

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

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


推荐阅读