使用最频繁的值按组填充缺失的值 [英] Fill missing values by group using most frequent value

查看:23
本文介绍了使用最频繁的值按组填充缺失的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用一个组的pandas模块使用最频繁的值来计算缺失值。在查看了一些关于堆栈溢出的帖子后,我设法做到了这一点:

import numpy as np
import pandas as pd

df = pd.DataFrame({"group": ["A", "A", "A", "A", "B", "B", "B"],
                   "value": [1, 1, 1, np.nan, 2, np.nan, np.nan]})
df.groupby("group").transform(lambda x: x.fillna(x.mode().iloc[0]))
运行此代码将用1填充A";组的缺失条目,用2同时填充B";组的缺失条目。但是,让我们假设其中一个组只包含缺少的数据(在本例中为组B&q;):

df1 = pd.DataFrame({"group": ["A", "A", "A", "A", "B", "B", "B"],
                   "value": [1, 1, 1, np.nan, np.nan, np.nan, np.nan]})
df1.groupby("group").transform(lambda x: x.fillna(x.mode().iloc[0]))
运行上面的代码将提示IndexError: single positional indexer is out-of-bounds。我希望正常的行为是保留np.nan,因为如果您运行方法mode,比如说,group";B";fromdf1

df1[df1.group == "B"].mode()

我会得到NaN是最常见的值。如何避免此问题?

推荐答案

运行上面的代码将提示IndexError:单一位置索引器越界

这是因为transform将每一列作为系列传递,并且在某个时刻它将单独看到value列;如果您这样做:

df1[df1.group == "B"].value.mode()

您将获得

Series([], dtype: float64)

因此,索引越界错误,因为它为空,iloc[0]不存在。

OTOH,当您这样做时:

df1[df1.group == "B"].mode()

mode是在数据帧而不是序列上计算的, pandas 决定在全NaN列,即这里的value列上给出NaN。

因此,一种补救方法是使用apply而不是transform将数据帧而不是单个系列传递给lambda

df1.groupby("group").apply(lambda x: x.fillna(x.mode().iloc[0])).reset_index(drop=True)

获取

  group  value
0     A    1.0
1     A    1.0
2     A    1.0
3     A    1.0
4     B    NaN
5     B    NaN
6     B    NaN

这篇关于使用最频繁的值按组填充缺失的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆