根据多列条件替换 Pandas 中的 NaN

Replace NaN in Pandas based on a multi-column condition

希望你一切顺利。

我需要帮助对我的数据框执行复杂的“NaN 替换”。

根据其他列过滤的其他列值的模式,替换 pandas 列中的 NaN 值的最佳方法是什么?

让我说明一下我的问题:

import random
import numpy as np
import pandas as pd
data = {'Region': [1,1,1,2,2,2,1,2,2,2,2,1,1,1,2,1], 'Country': ['a','a', 'a', 'a', 'a','a', 'a', 'a', 'b', 'b', 'b', 'b','b','b','b','b'], 'GDP' : [100,100,101,105,105,110,np.nan,np.nan,200,200,100,150,100,150,np.nan,np.nan]}
df = pd.DataFrame.from_dict(data)

df:

     Region Country GDP
0        1       a  100.0
1        1       a  100.0
2        1       a  101.0
3        2       a  105.0
4        2       a  105.0
5        2       a  110.0
6        1       a    NaN
7        2       a    NaN
8        2       b  200.0
9        2       b  200.0
10       2       b  100.0
11       1       b  150.0
12       1       b  100.0
13       1       b  150.0
14       2       b    NaN
15       1       b    NaN

I would like to replace the nan values of the GDP column with the mode of other GDP values for the same country and region.

对于索引 6 的 GDP 列的 NaN 值,我希望将其替换为 100(因为它是区域 1 和国家 a 的 GDP 值的模式)

所需的输出应如下所示:

    Region Country  GDP
0        1       a  100
1        1       a  100
2        1       a  101
3        2       a  105
4        2       a  105
5        2       a  110
6        1       a  100
7        2       a  105
8        2       b  200
9        2       b  200
10       2       b  100
11       1       b  150
12       1       b  100
13       1       b  150
14       2       b  200
15       1       b  150 

感谢您的帮助,希望您今天过得愉快!

Pandas' fillna 允许填充另一个系列中的缺失值。所以我们需要另一个系列,其中包含每个 Country/Region 在相应索引处的模式。

要得到这个系列,我们可以使用Pandas'groupby().transform()操作。它对数据帧进行分组,然后将结果广播回原始形状。

如果我们将此操作与 mode 一起使用,将会报错。模式可以 return 多个值,防止 pandas 将值广播回原始形状。所以我们需要强制它成为 return 一个单一的值,所以只选择第一个(或最后一个,或以哪个为准)。

df["GDP"].fillna(
    df.groupby(["Country", "Region"])["GDP"].transform(
        lambda x: x.mode()[0]
    )
)