我知道可以使用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
答案 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]]))