Python 缺失值在conti var中替换为med/mean,在pandas dataframe中替换为Category var中的mode-按列分组数据后)

Python 缺失值在conti var中替换为med/mean,在pandas dataframe中替换为Category var中的mode-按列分组数据后),python,pandas,Python,Pandas,我有一个pandas数据框,其中所有缺失的值都是np.nan,现在我正在尝试替换这些缺失的值。我的数据的最后一列是“类”,我需要根据类对数据进行分组,然后获得该列组的平均值/中位数/模式(基于数据是否为分类/连续,正常/非),并用相应的平均值/中位数/模式替换coulmn组的缺失值 这是我想出的代码,我知道这是一种过分的手段。。 如果我可以: 对数据帧的列进行分组 获取COL组的中值/模式/平均值 替换那些丢失的组 将它们重新组合回原始df 那太好了 但目前我找到了替代值(平均值/中值/模式)并

我有一个pandas数据框,其中所有缺失的值都是np.nan,现在我正在尝试替换这些缺失的值。我的数据的最后一列是“类”,我需要根据类对数据进行分组,然后获得该列组的平均值/中位数/模式(基于数据是否为分类/连续,正常/非),并用相应的平均值/中位数/模式替换coulmn组的缺失值

这是我想出的代码,我知道这是一种过分的手段。。 如果我可以:

  • 对数据帧的列进行分组
  • 获取COL组的中值/模式/平均值
  • 替换那些丢失的组
  • 将它们重新组合回原始df
  • 那太好了

    但目前我找到了替代值(平均值/中值/模式)并存储在dict中,然后将nan元组和非nan元组分开。。替换nan元组中缺少的值。。并尝试将它们连接回数据帧(我还不知道该怎么做)

    def fillMissing(df,数据类型):
    '''
    Args:
    df(二维阵列/Dict):
    例如:('attribute1':[12,24,25],'attribute2':['good','bad'])
    数据类型(dict):作为键和值的df属性名称字典0/1
    指示分类/连续变量,例如:('attribute1':1,'attribute2':0)
    返回:
    已填充缺少值的数据帧
    写入缺少值的文件。
    '''
    dataLabels=list(df.columns.values)
    #保存要替换nan的值的字典
    replaceValues={}
    对于dataLabels中的每个标签:
    thisSer=df[每个标签]
    如果数据类型[eachlabel]==1:#如果是连续变量
    _,pval=stats.normaltest(thisSer)
    groupedd=thisSer.groupby(df['class'])
    innerDict={}
    对于名称,groupedd中的组:
    如果(pval<0.5):
    groupMiddle=group.median()#获取组的中位数
    其他:
    groupMiddle=group.mean()#获取平均值(如果组正常)
    innerDict[name.strip()]=groupMiddle
    replaceValues[eachlabel]=innerDict
    否则:#如果序列是连续的
    #freqCount=collections.Counter(thisSer)
    groupedd=thisSer.groupby(df['class'])
    innerDict={}
    对于名称,groupedd中的组:
    freqC=集合计数器(组)
    mostFreq=freqC.most_common(1)#获取属性的最频繁值(按类分组)
    #newGroup=group.replace(np.nan,mostFreq)
    innerDict[name.strip()]=mostFreq[0][0].strip()
    replaceValues[eachlabel]=innerDict
    打印替换值
    #替换缺少的值=======================
    newfile=open('missingsreplaced.csv','w')
    newdf=df
    掩码=假
    对于df.columns中的列:mask=mask | df[col].isnull()
    #获取包含空值的元组的数据帧
    dfnulls=df[mask]
    dfnotNulls=df[~掩码]
    对于,dfnulls.iterrows()中的行:
    对于dataLabels中的colname:
    如果pd.isnull(行[colname]):
    如果行['class'].strip()='>50K':
    行[colname]=replaceValues[colname]['>50K']
    其他:
    
    行[colname]=replaceValues[colname]['如果我理解正确,这主要是在中,但如果你问这个问题,可能不是你要看的地方。请参阅底部关于
    模式的注释,因为它比
    平均值
    中值
    稍微复杂一些

    df = pd.DataFrame({ 'v':[1,2,2,np.nan,3,4,4,np.nan] }, index=[1,1,1,1,2,2,2,2],)
    
    df['v_mean'] = df.groupby(level=0)['v'].transform( lambda x: x.fillna(x.mean()))
    df['v_med' ] = df.groupby(level=0)['v'].transform( lambda x: x.fillna(x.median()))
    df['v_mode'] = df.groupby(level=0)['v'].transform( lambda x: x.fillna(x.mode()[0]))
    
    df
        v    v_mean  v_med  v_mode
    1   1  1.000000      1       1
    1   2  2.000000      2       2
    1   2  2.000000      2       2
    1 NaN  1.666667      2       2
    2   3  3.000000      3       3
    2   4  4.000000      4       4
    2   4  4.000000      4       4
    2 NaN  3.666667      4       4
    

    请注意,
    mode()
    可能不是唯一的,这与
    mean
    median
    不同,pandas因此将其作为
    系列
    返回
    以提取该系列的第一个成员。

    如果您能提供一个小样本数据集和一个您试图实现的结果示例,这会有所帮助。感谢@JohnE,我仍在阅读您的重播并试图理解它;我使用的数据集是我正在使用成人.data文件。
    df = pd.DataFrame({ 'v':[1,2,2,np.nan,3,4,4,np.nan] }, index=[1,1,1,1,2,2,2,2],)
    
    df['v_mean'] = df.groupby(level=0)['v'].transform( lambda x: x.fillna(x.mean()))
    df['v_med' ] = df.groupby(level=0)['v'].transform( lambda x: x.fillna(x.median()))
    df['v_mode'] = df.groupby(level=0)['v'].transform( lambda x: x.fillna(x.mode()[0]))
    
    df
        v    v_mean  v_med  v_mode
    1   1  1.000000      1       1
    1   2  2.000000      2       2
    1   2  2.000000      2       2
    1 NaN  1.666667      2       2
    2   3  3.000000      3       3
    2   4  4.000000      4       4
    2   4  4.000000      4       4
    2 NaN  3.666667      4       4