使用groupby和mode填充Pandas中的缺失值

3

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

我希望根据每个组别的"make"列进行分组,并基于中位数(对于数值条目)和众数(对于分类条目)来填补缺失值。但是,我不想在整个数据集上计算中位数和众数,而是要进行分组计算。

对于数值NA值,我采取了以下措施:

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

...这段代码完美地将所有数值型的NA值替换为它们"make"的中位数。

然而,对于分类变量的NA值,我无法像数值型一样使用众数进行替换,即用其"make"的众数替换所有的分类变量NA值。

有人知道如何实现吗?

1个回答

9
您可以使用 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   

非常感谢!我用你提供的虚拟数据试了一下,结果是成功的。 不过很遗憾,当我在我的数据集上尝试时,出现了一个 IndexError 'single positional indexer is out-of-bounds' 的错误。这可能是因为某些 "make" 分组中只有 NaN 值,导致无法计算中位数或众数。你有什么办法可以解决这个问题吗(例如,如果一个分组中只有 NaN 值,那么使用整体的中位数/众数)? - mt1212
4
你好,需要将x.mode().iloc[0]更改为next(iter(x.mode()), np.nan),请确认。 - jezrael
@jezrael:你可以通过简单地使用x.mode().head()来防止在具有多个模式的组上发生错误。而且,你可以通过.mode(dropna=False).head()来防止在所有NaN组上发生错误。 - smci
...而且你可以通过pandas.DataFrame.select_dtypes()避免所有的np.issubdtype(...) - smci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接