首页 > 解决方案 > 缺失值 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)的解决方案不是最佳的,因为我有几列(示例中的“...”)并且需要系统解决方案。

谢谢

标签: pythonpandasdataframeinterpolationfillna

解决方案


您可以使用该参数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

推荐阅读