使用每列的平均值填充NaN

时间:2015-11-30 16:44:16

标签: 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')之后&用组替换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

2 个答案:

答案 0 :(得分:4)

IIUC然后,您可以使用fillna的结果致电groupby' a'和transform on' 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

您获得NaN所有NaN的' d'因为1

的组d的所有值均为/b

答案 1 :(得分:0)

我们首先计算组均值,忽略缺失值:

group_means = df.groupby('a')['b'].agg(lambda v: np.nanmean(v))

接下来,我们再次使用groupby,这次取相应的值:

df_new = df.groupby('a').apply(lambda t: t.fillna(group_means.loc[t['a'].iloc[0]]))