缺少替换条件Python的值

2024-09-30 01:21:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集,其中包含一系列国家和年份(30721134行和列)的几个指标的值,但有些是NaN

下面是数据集的示例:

^{tb1}$

我想根据Submitted列的值替换缺少的值。

仅当相应的Submitted值为“NaN”时,我才想更改前一行的值。

这就是我想要的:

^{tb2}$

在社区的帮助下,我尝试使用

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值。

输出:

^{tb3}$

查看CHI 2019 Age14和BRI Age12和Age14的错误输出

您知道如何通过修复此代码来解决此问题吗? 使用循环或选择这两列(年龄14和年龄12)的解决方案不是最优的,因为我有几个列(“…”),需要系统的解决方案

多谢各位


Tags: 数据代码dfnanwheremethodlimit年龄
1条回答
网友
1楼 · 发布于 2024-09-30 01:21:58

您可以使用参数limit=1来限制仅从前一行值填充,而不是从更高的行值填充:

df = df.where(~df.Submitted.isnull(), df.fillna(axis=0, method='ffill',limit=1))

或者更好的做法是,简化代码,如下所示:

使用^{}而不是^{},这样代码就不需要额外的步骤来否定布尔掩码。另外,使用^{},这是.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

相关问题 更多 >

    热门问题