首页 > 解决方案 > 使用最频繁的值按组填充缺失值

问题描述

pandas我正在尝试使用Python中的模块使用组中最常见的值来估算缺失值。在查看 Stack Overflow 上的一些帖子后,我设法实现了这一点:

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”):

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,例如,组“B”来自df1

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

我会知道 NaN 是最常见的值。我怎样才能避免这个问题?

标签: python-3.xpandaspandas-groupbynanimputation

解决方案


运行上面的代码会提示 IndexError: single positional indexer is out-of-bounds

这是因为transformget 将每一列作为一个系列传递,并且在某些时候它会单独看到该value列;如果你这样做:

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

你得到

Series([], dtype: float64)

因此索引越界之类的错误,因为它是空的并且iloc[0]不存在。

OTOH,当你这样做时:

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

mode是根据数据框而不是系列计算的,pandas 决定在全 NaN 列上给出 NaN,即value此处的列。

因此,一种补救措施是使用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

推荐阅读