python - 缺失值 NaN 替换条件 Python
问题描述
我有一个数据集,其中包含一系列国家和年份的几个指标的值(3072,1134 行和列),但有一些 NaN。
在下面找到数据集的示例:
年 | 国家 | 已提交 | 年龄12 | 年龄14 | ... |
---|---|---|---|---|---|
2017 | 气 | 1 | 267 | 136 | ... |
2018 | 气 | 1 | 267 | 钠 | ... |
2019 | 气 | 钠 | 钠 | 钠 | ... |
2020 | 气 | 1 | 244 | 203 | ... |
2017 | ALB | 1 | 160 | 148 | ... |
2018 | ALB | 1 | 163 | 165 | ... |
2019 | ALB | 1 | 钠 | 钠 | ... |
2020 | ALB | 1 | 161 | 钠 | ... |
2017 | GER | 1 | 钠 | 320 | ... |
2018 | GER | 1 | 451 | 381 | ... |
2019 | GER | 钠 | 钠 | 钠 | ... |
2020 | GER | 1 | 361 | 321 | |
2017 | 一带一路 | 1 | 钠 | 钠 | ... |
2018 | 一带一路 | 1 | 钠 | 钠 | ... |
2019 | 一带一路 | 钠 | 钠 | 钠 | ... |
2020 | 一带一路 | 1 | 322 | 298 |
我想根据列的值替换缺失值Submitted
。
Submitted
只有当相应的值为“NaN”时,我才想更改前一行的值。
这就是我想要的:
年 | 国家 | 已提交 | 年龄12 | 年龄14 | ... |
---|---|---|---|---|---|
2017 | 气 | 1 | 267 | 136 | ... |
2018 | 气 | 1 | 267 | 钠 | ... |
2019 | 气 | 1 | 267 | 钠 | ... |
2020 | 气 | 1 | 244 | 203 | ... |
2017 | ALB | 1 | 160 | 148 | ... |
2018 | ALB | 1 | 163 | 165 | ... |
2019 | ALB | 1 | 钠 | 钠 | ... |
2020 | ALB | 1 | 161 | 钠 | ... |
2017 | GER | 1 | 钠 | 320 | ... |
2018 | GER | 1 | 451 | 381 | ... |
2019 | GER | 1 | 451 | 381 | ... |
2020 | GER | 1 | 361 | 321 | ... |
2017 | 一带一路 | 1 | 钠 | 钠 | ... |
2018 | 一带一路 | 1 | 钠 | 钠 | ... |
2019 | 一带一路 | 1 | 钠 | 钠 | ... |
2020 | 一带一路 | 1 | 322 | 298 |
在社区的帮助下,我尝试使用
df = df.where(~df.Sumbitted.isnull(), df.fillna(axis=0, method='ffill'))
和
df = df.where(~df.Sumbitted.isnull(), df.fillna(axis=0, method='ffill',limit=2))
和
df = df.where(~df.Sumbitted.isnull(), interpolate(method="pad", limit=2))
但是,使用这些选项我会得到以下内容。问题是代码检索前一个非 NaN 值,但在前一个值是 NaN 的情况下,代码检索前一个值之前的值,直到找到非 NaN 值。
输出:
年 | 国家 | 已提交 | 年龄12 | 年龄14 | ... |
---|---|---|---|---|---|
2017 | 气 | 1 | 267 | 136 | ... |
2018 | 气 | 1 | 267 | 钠 | ... |
2019 | 气 | 1 | 267 | 136 | ... |
2020 | 气 | 1 | 244 | 203 | ... |
2017 | ALB | 1 | 160 | 148 | ... |
2018 | ALB | 1 | 163 | 165 | ... |
2019 | ALB | 1 | 钠 | 钠 | ... |
2020 | ALB | 1 | 161 | 钠 | ... |
2017 | GER | 1 | 钠 | 320 | ... |
2018 | GER | 1 | 451 | 381 | ... |
2019 | GER | 1 | 451 | 381 | ... |
2020 | GER | 1 | 361 | 321 | |
2017 | 一带一路 | 1 | 钠 | 钠 | ... |
2018 | 一带一路 | 1 | 钠 | 钠 | ... |
2019 | 一带一路 | 1 | 361 | 321 | ... |
2020 | 一带一路 | 1 | 322 | 298 |
查看 CHI 2019 Age14 和 BRI Age12 和 Age14 的错误输出
您知道如何通过修复此代码来解决此问题吗?使用循环或选择这 2 列(Age14 和 Age12)的解决方案不是最佳的,因为我有几列(示例中的“...”)并且需要系统解决方案。
谢谢
解决方案
您可以使用该参数limit=1
来限制仅从前一行值填充,而不是从更远的位置开始填充:
df = df.where(~df.Submitted.isnull(), df.fillna(axis=0, method='ffill',limit=1))
或者更好的是,简化您的代码,如下所示:
使用.mask()
而不是.where
这样您的代码不需要额外的步骤来否定布尔掩码。此外,使用ffill()
它是 的简化形式.fillna(axis=0, method='ffill')
:
df = df.mask(df.Submitted.isna(), df.ffill(limit=1))
结果:
print(df)
Year Country Submitted Age12 Age14
0 2017 CHI 1.0 267.0 136.0
1 2018 CHI 1.0 267.0 NaN
2 2019 CHI 1.0 267.0 NaN
3 2020 CHI 1.0 244.0 203.0
4 2017 ALB 1.0 160.0 148.0
5 2018 ALB 1.0 163.0 165.0
6 2019 ALB 1.0 NaN NaN
7 2020 ALB 1.0 161.0 NaN
8 2017 GER 1.0 NaN 320.0
9 2018 GER 1.0 451.0 381.0
10 2019 GER 1.0 451.0 381.0
11 2020 GER 1.0 361.0 321.0
12 2017 BRI 1.0 NaN NaN
13 2018 BRI 1.0 NaN NaN
14 2019 BRI 1.0 NaN NaN
15 2020 BRI 1.0 322.0 298.0
推荐阅读
- c# - 在将组件添加到所有对象之前,如何设置刚体组件设置?
- html - 伪元素中的 Internet Explorer 材质图标不起作用
- azure-devops - dev.azure.com,可以添加用户,但不能更改密码
- python - OAuthException:来自谷歌的无效响应
- python - 将 csv 转换为 json 作为字典键对列表(python)
- netsuite - 如何在 Suitelet 中设置 context.currentRecord?
- python - 如何确定 Google colab 中的文件路径?
- jquery - 显示 div onclick,添加类,在其他 div 上获取相同的过程
- android - QRScanner - 扫描路由器后导航不起作用
- php - 是否可以在仅数字的值上注入 sql?