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