首页 > 解决方案 > 根据多列条件替换 Pandas 中的 NaN

问题描述

我希望你做得很好。

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

根据其他列过滤的其他列值的模式,替换熊猫列中的 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)

东风:

     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

我想用同一国家和地区的其他 GDP 值的模式替换 GDP 列的 nan 值。

对于索引 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 

谢谢你的帮助,我希望你有一个美好的一天!

标签: pythonpandasdataframenulldata-cleaning

解决方案


Pandasfillna允许填充另一个系列的缺失值。因此,我们需要另一个系列,其中包含相应索引处每个国家/地区的模式。

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

如果我们按原样使用此操作mode,则会出错。Mode 可以返回多个值,防止 pandas 将值广播回原始形状。所以我们需要强制它返回一个值,所以只需选择第一个(或最后一个,或任何一个)。

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

推荐阅读