代码之家  ›  专栏  ›  技术社区  ›  Md. Rezwanul Haque

如何处理与数据集类型相关的缺失数据?

  •  0
  • Md. Rezwanul Haque  · 技术社区  · 7 年前

    类型 那有一种 Primary , Secondary .

       ID    types        C   D
    0  101   Primary      2   3
    1  103   Primary      6   3
    2  108   Primary     10   ?
    3  109   Primary      3  12
    4  118   Secondary    5   2
    5  122   Secondary    ?   6
    6  123   Secondary    5   6
    7  125   Secondary    2   5 
    

    我想用替换缺少的值 median 对于每种类型。比如-

    结果

       ID    types        C   D
    0  101   Primary      2   3
    1  103   Primary      6   3
    2  108   Primary     10   3
    3  109   Primary      3  12
    4  118   Secondary    5   2
    5  122   Secondary    5   6
    6  123   Secondary    5   6
    7  125   Secondary    2   5 
    

    2 回复  |  直到 7 年前
        1
  •  2
  •   Mayank Porwal    7 年前

    第一次替换 ? np.nan 价值观:

    In [1268]: df = df.replace('?',np.nan)
    In [1273]: df
    Out[1273]: 
        ID      types    C    D
    0  101    Primary    2    3
    1  103    Primary    6    3
    2  108    Primary   10  NaN
    3  109    Primary    3   12
    4  118  Secondary    5    2
    5  122  Secondary  NaN    6
    6  123  Secondary    5    6
    7  125  Secondary    2    5
    

    对我来说 dtypes 显示为 object C 和 D . 因此,在找到中值之前,我将其转换为数值。如果这是 不适用于您,请跳过此步骤并直接运行下面的 指挥 transform 功能。

    In [1274]: df.dtypes
    Out[1274]: 
    ID        int64
    types    object
    C        object
    D        object
    dtype: object
    

    为了找到 median ,转换列 和 D

    In [1256]: df.C = df.C.apply(pd.to_numeric)
    In [1258]: df.D = df.D.apply(pd.to_numeric)
    
    In [1279]: df.dtypes
    Out[1279]: 
    ID         int64
    types     object
    C        float64
    D        float64
    dtype: object
    

    中值的 两列中的类型数 和 如下图所示,使用 groupby 和 使改变 功能:

    In [1265]: df.C = df.C.fillna(df.groupby('types')['C'].transform('median'))
    
    In [1266]: df.D = df.D.fillna(df.groupby('types')['D'].transform('median'))
    
    In [1267]: df
    Out[1267]: 
        ID      types     C     D
    0  101    Primary   2.0   3.0
    1  103    Primary   6.0   3.0
    2  108    Primary  10.0   3.0
    3  109    Primary   3.0  12.0
    4  118  Secondary   5.0   2.0
    5  122  Secondary   5.0   6.0
    6  123  Secondary   5.0   6.0
    7  125  Secondary   2.0   5.0
    

        2
  •  1
  •   Venkatachalam    7 年前

    如@Mayank Porwal所述,首先将缺失值转换为np.nan,然后可以使用 sklearn impute 方法。

    simpleImputer

    import numpy as np
    import pandas as pd
    
    df.replace('?',np.nan,inplace=True)
    
    from sklearn.impute import SimpleImputer
    
    for types,group in df.groupby('types'):
        imp = SimpleImputer(missing_values=np.nan, strategy='median')
        df.loc[df['types']==types,['C','D']] = imp.fit_transform(group[['C','D']])