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

标签 python pandas nan

我想用仅具有类别 B 的行的平均值填充数据帧上 c 上的 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 行。

最佳答案

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

关于python - 根据另一列特定值用平均值填充 NaN 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58985640/

相关文章:

python - 如何制作一个迭代超过 1500 万条记录的 for 循环,节省空间?

python - Pandas:使用qcut(data,3)后,如何找到分位数的范围

python - python pandas中提取子字符串的正则表达式

javascript - 检查 JavaScript 中的 'undefined' && ip 格式不起作用

python - 通过跳过 Python/Pandas 中的某些值来计算数据帧平均值

java - 从pyspark手动调用spark的垃圾回收

python - PySpark - 将单个整数列表与列表列进行比较

python - pandas:使用 loc 迭代 DataFrame 索引

python - 为什么使用 read_csv() 创建的 DataFrame 与使用相同数据的 DataFrame() 创建的另一个 DataFrame 不同?

python - n-gram 马尔可夫链转换表