【问题标题】:Remove rows with more than percentage of missing data for majority class samples only仅删除大多数类样本的缺失数据百分比超过百分比的行
【发布时间】:2021-04-22 18:53:47
【问题描述】:

post 类似,我正在删除具有 >50% 缺失数据的行以获得更可靠和完整的数据集

# Keep only the rows with at least x% non-NA values

# calculate threshold
numOfFeatures=38 # num of features in dataset
x=round(numOfFeatures*0.5) #50%

dfWithDroppedRows = df.dropna(thresh=x)

但是,我有一个不平衡的数据集,其中多数类占我数据集的近 93%

df['y'].value_counts(normalize=True) * 100
No     92.769441
Yes     7.230559

因此,我想编辑上面的代码,仅从多数类的样本中删除 >50% 缺失数据的行,这样我就不会丢失少数类的样本。

为此,我已经尝试过:

dfWithDroppedRows = df[df['y'] == 'No'].dropna(thresh=x)

但这会导致 dfWithDroppedRows 仅包含来自多数类的减少行,而不是来自少数类的样本。我想我可以通过将 dfWithDroppedRows 与 df[df['y'] == 'Yes'] 连接来解决这个问题,但我觉得应该有一种更直接的方法来做到这一点。有什么建议吗?

【问题讨论】:

    标签: python pandas dataframe imbalanced-data


    【解决方案1】:

    在我看来,连接两个 DataFrame 并不是一个坏主意,但如果你不喜欢它,这是我的建议。

    mask_majority = df.eval("y == 'No'")
    mask_missing = df.isna().sum(axis="columns") >= x
    
    import numpy as np
    
    mask_drop = np.logical_and(mask_majority, mask_missing)
    mask_keep = np.logical_not(mask_drop)
    dfWithDroppedRows = df.loc[mask_keep, :]
    

    基本上,我为多数类创建一个掩码,并为所有缺失值超过x 的行创建一个掩码。 然后我将这两个掩码组合起来,得到一个包含所有不能删除的行的掩码,并使用.loc 得到仅包含这些行的DataFrame。

    顺便说一句,如果您决定使用连接两个DataFrame的初始解决方案,我会使用query方法代替,它更惯用:

    df_majority_droppedRows = df.query("y == 'No'").dropna(thresh=x)
    df_minority = df.query("y == 'Yes'")
    dfWithDroppedRows = pd.concat([df_majority_droppedRows, df_minority])
    

    【讨论】:

    • 感谢您的回答。我最终连接了两个数据帧,因为它看起来更简单!不过,您的代码中有错字;只需将 'tresh' 替换为 'thresh'。
    • 感谢您告诉我!现在我将不得不修复我使用过“tresh”的所有脚本。
    猜你喜欢
    • 1970-01-01
    • 2013-01-01
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-22
    • 1970-01-01
    相关资源
    最近更新 更多