首页 > 解决方案 > 用每列的特定值替换 NaN 值

问题描述

我有一个包含值以及一些 NaN 的数据框。现在我有了列的平均值,我想将特定列的平均值插入到 NaN 值中。例如:

ColA 和 ColB 将 NaN 替换为我的平均值

我有 ColA 和 ColB 的平均值。我想将它们插入到 NaN 位置。我可以使用 replace 方法单独执行此操作。但是对于很多专栏,有没有其他方法可以实现这一点?

标签: pythonpandas

解决方案


编辑:

如果已经有 Series with 意味着只使用DataFrame.fillna

df = pd.DataFrame({
        'A':list('abcdef'),
         'B':[4,np.nan,4,5,5,4],
         'C':[7,8,9,4,2,3],
         'D':[1,3,5,np.nan,1,0],
         'E':[np.nan,3,6,np.nan,2,4],
         'F':list('aaabbb')
})

means = pd.Series([10,20], index=['B','E'])

df= df.fillna(means)
print (df)
   A     B  C    D     E  F
0  a   4.0  7  1.0  20.0  a
1  b  10.0  8  3.0   3.0  a
2  c   4.0  9  5.0   6.0  a
3  d   5.0  4  NaN  20.0  b
4  e   5.0  2  1.0   2.0  b
5  f   4.0  3  0.0   4.0  b

如果需要替换所有使用DataFrame.fillna的数字列中的缺失值mean- 它可以工作,因为mean排除非数字列:

df = pd.DataFrame({
        'A':list('abcdef'),
         'B':[4,np.nan,4,5,5,4],
         'C':[7,8,9,4,2,3],
         'D':[1,3,5,np.nan,1,0],
         'E':[np.nan,3,6,np.nan,2,4],
         'F':list('aaabbb')
})

df1 = df.fillna(df.mean())
print (df1)
   A    B  C    D     E  F
0  a  4.0  7  1.0  3.75  a
1  b  4.4  8  3.0  3.00  a
2  c  4.0  9  5.0  6.00  a
3  d  5.0  4  2.0  3.75  b
4  e  5.0  2  1.0  2.00  b
5  f  4.0  3  0.0  4.00  b

如果需要指定列,则仅使用列名列表更改解决方案:

cols = ['D','B']
df[cols] = df[cols].fillna(df[cols].mean())
print (df)
   A    B  C    D    E  F
0  a  4.0  7  1.0  NaN  a
1  b  4.4  8  3.0  3.0  a
2  c  4.0  9  5.0  6.0  a
3  d  5.0  4  2.0  NaN  b
4  e  5.0  2  1.0  2.0  b
5  f  4.0  3  0.0  4.0  b

推荐阅读