python - 如何使用 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)
但我仍然想知道我之前尝试的解决方案有什么问题。
解决方案
正如评论中所提到的,这是一种相当奇怪的方式来实现您的目标,其中存在多个与良好编程实践背道而驰的问题
所以从免责声明开始:我不建议这样做,但我只是回答有关函数行为的问题。
排除了免责声明,这可以通过两个小改动来实现。以下应该工作
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
函数(如果不清楚,您可以随意调用它)
推荐阅读
- ios - 有什么方法可以让按钮在第一次按下时做某事,而在 Swift 中的第二次按下时做其他事情
- datetime - 如何使用 Ms Access Date/Time Extended 数据类型
- java - 删除选定 Spinner 上的所有 liveData 和 Observer
- r - 函数返回数字而不是团队?
- makefile - 如何在 Windows 上的 hunspell 搜索路径中添加字典路径?
- java - 来自多个活动的意图
- reactjs - 为什么 scrollToEnd() 在 Android 上不起作用?
- ms-access - 以 Access 连续形式对计算控件求和
- oracle - Oracle云中IAM、IDCS和OCI的区别
- python - 可以在 authlib 中使用 POST 和 json 正文请求 oAuth 令牌吗?