您可以使用
GroupBy.transform
对数值列使用中位数,对分类列使用众数的
if-else
。
df = pd.DataFrame({
'A':list('ebcded'),
'B':[np.nan,np.nan,4,5,5,4],
'C':[7,np.nan,9,4,2,3],
'D':[1,3,5,np.nan,1,0],
'F':list('aaabbb'),
'make':list('aaabbb')
})
df.loc[[2,4], 'A'] = np.nan
df.loc[[2,5], 'F'] = np.nan
print (df)
A B C D F make
0 e NaN 7.0 1.0 a a
1 b NaN NaN 3.0 a a
2 NaN 4.0 9.0 5.0 NaN a
3 d 5.0 4.0 NaN b b
4 NaN 5.0 2.0 1.0 b b
5 d 4.0 3.0 0.0 NaN b
f = lambda x: x.median() if np.issubdtype(x.dtype, np.number) else x.mode().iloc[0]
df = df.fillna(df.groupby('make').transform(f))
print (df)
A B C D F make
0 e 4 7 1 a a
1 b 4 7 3 a a
2 b 4 9 5 a a
3 d 5 4 0 b b
4 d 5 2 1 b b
5 d 4 3 0 b b
x.mode().iloc[0]
更改为next(iter(x.mode()), np.nan)
,请确认。 - jezraelx.mode().head()
来防止在具有多个模式的组上发生错误。而且,你可以通过.mode(dropna=False).head()
来防止在所有NaN组上发生错误。 - smcipandas.DataFrame.select_dtypes()
避免所有的np.issubdtype(...)
。 - smci