Pandas fillna 使用 groupby 和 mode

mt1*_*212 2 python group-by pandas fillna pandas-groupby

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

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

对于数值,我做了以下工作:

data = data.fillna(data.groupby("make").transform("median"))
Run Code Online (Sandbox Code Playgroud)

--> 这完美地工作,并用NA它们的中位数替换了我所有的数值"make"

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

有谁知道怎么做?

jez*_*ael 6

您可以将GroupBy.transformwith if-elseformedian用于数字和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'),
         'G':list('aaabbb')
})

df.loc[[2,4], 'A'] = np.nan
df.loc[[2,5], 'F'] = np.nan
print (df)
     A    B    C    D    F  G
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
Run Code Online (Sandbox Code Playgroud)
f = lambda x: x.median() if np.issubdtype(x.dtype, np.number) else x.mode().iloc[0]
df = df.fillna(df.groupby('G').transform(f))
print (df)

   A  B  C  D  F  G
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
Run Code Online (Sandbox Code Playgroud)

  • @mt1212 你可以检查更改`x.mode()。iloc[0]` 到 `next(iter(x.mode()), np.nan)` ? (4认同)