【问题标题】:Fill missing values by group using most frequent value使用最频繁的值按组填充缺失值
【发布时间】:2021-07-06 16:00:12
【问题描述】:

我正在尝试使用 Python 中的 pandas 模块使用组中最常见的值来估算缺失值。在查看 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 只是,比如说,来自 df1 的组“B”:

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

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

【问题讨论】:

    标签: python-3.x pandas pandas-groupby nan imputation


    【解决方案1】:

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

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

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

    你得到

    Series([], dtype: float64)
    

    因此 index-out-of-bounds like error 因为它是空的并且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
    

    【讨论】:

      猜你喜欢
      • 2021-10-21
      • 1970-01-01
      • 2019-11-18
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      相关资源
      最近更新 更多