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

时间:2019-11-22 00:11:32

标签: python pandas nan

我想仅对列为c的行用均值填充B列的数据框上的NaN值,而忽略其他值。

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

2 个答案:

答案 0 :(得分:3)

结合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

或者直接分配两个蒙版

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

答案 1 :(得分:-1)

这将是您的问题的答案:

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