Pandas fillna 使用 groupby 和模式

Pandas fillna using groupby and mode

我最近开始使用 Pandas,目前正在尝试估算数据集中的一些缺失值。

我想根据中位数(对于数字条目)和众数(对于分类条目)来估算缺失值。但是,我不想计算整个数据集 的中位数和众数 ,而是基于我的专栏 "make"GroupBy 按组计算。

对于数值 NA 值我做了以下操作:

data = data.fillna(data.groupby("make").transform("median"))

...完美地工作并将我所有的数字 NA 值替换为它们的 "make".

的中值

但是,对于分类 NA 值,我无法对模式做同样的事情,即用它们的模式替换所有分类 NA 值 "make".

有人知道怎么做吗?

您可以将 GroupBy.transformif-else 一起用于 median 数字列和 mode 分类列:

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