Pandas 使用 groupby 和模式填充

Posted

技术标签:

【中文标题】Pandas 使用 groupby 和模式填充【英文标题】:Pandas fillna using groupby and mode 【发布时间】:2020-03-26 09:20:44 【问题描述】:

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

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

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

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

--> 这可以完美地工作,并将我所有的数字 NA 值替换为其 "make" 的中位数。

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

有人知道怎么做吗?

【问题讨论】:

【参考方案1】:

您可以将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'),
         '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

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

【讨论】:

非常感谢!我用你的虚拟数据试过了,它奏效了。不幸的是,当我在我的数据集上尝试它时,我得到一个 IndexError 'single positional indexer is out-of-bounds'。这可能是因为对于“make”的某些 GroupBy 只有 NaN 值,这使得无法计算中位数或众数?我可以做些什么来规避这个问题(例如,如果只有 NaN 在一个组中,那么使用整体中位数/众数..)? @mt1212 你能检查将x.mode(). iloc[0] 更改为next(iter(x.mode()), np.nan) 吗? @mt1212 - 超级棒!如果我的回答有帮助,请不要忘记accept。谢谢。

以上是关于Pandas 使用 groupby 和模式填充的主要内容,如果未能解决你的问题,请参考以下文章

pandas.groupby中的迭代

在python pandas中groupby之后从列中填充缺失的行

如何用零填充 pandas groupby 列表的缺失日期?

Pandas分组与聚合

如何使用 pandas groupby() 的 split-apply-combine 模式同时规范化多个列

Pandas:使用日期时间索引进行分组前向填充