python - 用每列的一组平均值填充 NaN

标签 python pandas

<分区>

我知道 fillna() 方法可用于在整个数据帧中填充 NaN。

df.fillna(df.mean()) # fill with mean of column.

如何将均值计算限制在 NaN 所在的组(和列)。

示例:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({
    'a': pd.Series([1,1,1,2,2,2]),
    'b': pd.Series([1,2,np.NaN,1,np.NaN,4])
})

print df

输入

   a   b
0  1   1
1  1   2
2  1 NaN
3  2   1
4  2 NaN
5  2   4

输出(在 groupby('a') 之后 & 用 group 替换 NaN)

   a    b
0  1  1.0
1  1  2.0
2  1  1.5
3  2  1.0
4  2  2.5
5  2  4.0

最佳答案

IIUC 那么你可以调用fillna结果为 groupby在 'a' 和 transform 上在“b”上:

In [44]:
df['b'] = df['b'].fillna(df.groupby('a')['b'].transform('mean'))
df

Out[44]:
   a    b
0  1  1.0
1  1  2.0
2  1  1.5
3  2  1.0
4  2  2.5
5  2  4.0

如果您有多个 NaN 值,那么我认为以下应该有效:

In [47]:
df.fillna(df.groupby('a').transform('mean'))

Out[47]:
   a    b
0  1  1.0
1  1  2.0
2  1  1.5
3  2  1.0
4  2  2.5
5  2  4.0

编辑

In [49]:
df = pd.DataFrame({
    'a': pd.Series([1,1,1,2,2,2]),
    'b': pd.Series([1,2,np.NaN,1,np.NaN,4]),
    'c': pd.Series([1,np.NaN,np.NaN,1,np.NaN,4]),
    'd': pd.Series([np.NaN,np.NaN,np.NaN,1,np.NaN,4])
})
df

Out[49]:
   a   b   c   d
0  1   1   1 NaN
1  1   2 NaN NaN
2  1 NaN NaN NaN
3  2   1   1   1
4  2 NaN NaN NaN
5  2   4   4   4

In [50]:
df.fillna(df.groupby('a').transform('mean'))

Out[50]:
   a    b    c    d
0  1  1.0  1.0  NaN
1  1  2.0  1.0  NaN
2  1  1.5  1.0  NaN
3  2  1.0  1.0  1.0
4  2  2.5  2.5  2.5
5  2  4.0  4.0  4.0

对于“d”,您得到所有​​ NaN,因为对于组 1,对于 d,所有值都是 NaN/p>

关于python - 用每列的一组平均值填充 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34003610/

相关文章:

python exec 在 2.7 和 3.3 之间表现不同

Python pandas - 提取多值属性

pandas - Numba 中的类型化列表与 ND 数组

python - 根据 GPS 数据计算距离 [经度和纬度]

python - 将 pandas csv 数据绘制到 cartopy map 上

python - 基于列 pandas 保留特定类型的行

javascript - Flask request.get.args - 缺少一个参数

python - urllib2:读取 https url 失败

python - Maya\python 递增值的增量按钮

python - 用 Pandas 首次出现的索引计算过渡的最小值和最大值