根据另一列特定值用平均值填充 NaN 值

fill NaN values with mean based on another column specific value

我想在我的数据框中 c 列的 NaN 值填充仅具有类别 B 的行的平均值,并忽略其他行。

print (df)
    Category   b    c
0   A          1  5.0
1   C          1  NaN
2   A          1  4.0
3   B          2  NaN
4   A          2  1.0
5   B          2  Nan
6   C          1  3.0
7   C          1  2.0
8   B          1  NaN

所以我现在正在做的是:

df.c = df.c.fillna(df.c.mean())

但它填充了所有 NaN 值,而我只想填充类别值等于 B.

的第 3、5 和 8 行

fillna与切片赋值相结合

df.loc[df.Category.eq('B'), 'c'] = (df.loc[df.Category.eq('B'), 'c'].
                                       fillna(df.c.mean()))

Out[736]:
  Category  b    c
0        A  1  5.0
1        C  1  NaN
2        A  1  4.0
3        B  2  3.0
4        A  2  1.0
5        B  2  3.0
6        C  1  3.0
7        C  1  2.0
8        B  1  3.0

或者直接赋值 2 个掩码

df.loc[df.Category.eq('B') & df.c.isna(), 'c'] = df.c.mean()

Out[745]:
  Category  b    c
0        A  1  5.0
1        C  1  NaN
2        A  1  4.0
3        B  2  3.0
4        A  2  1.0
5        B  2  3.0
6        C  1  3.0
7        C  1  2.0
8        B  1  3.0

这将是您问题的答案:

df.c = df.apply(
        lambda row: row['c'].fillna(df.c.mean()) if row['Category']=='B' else  row['c'] ,axis=1)