Python实现按类别将列中0值替换为对应类别众数
解决DataFrame中0值替换为对应类别众数的问题
没问题,我来帮你搞定这个0值替换的操作!你已经找到了获取类别众数的方法,接下来只需要把这些众数映射回原数据,替换掉错误的0值就行,这里给你两种实用的方案:
方案一:基于你已计算的众数结果替换
如果你已经通过groupby得到了每个类别对应的属性众数(假设这个结果存在group_modes变量里),可以用apply逐行判断替换:
# 先确认你已经拿到了类别众数 group_modes = data.groupby(['class'])['quality','taste'].agg(lambda x:x.value_counts().index[0]) # 替换quality列的0值 data['quality'] = data.apply( lambda row: group_modes.loc[row['class'], 'quality'] if row['quality'] == 0 else row['quality'], axis=1 ) # 替换taste列的0值 data['taste'] = data.apply( lambda row: group_modes.loc[row['class'], 'taste'] if row['taste'] == 0 else row['taste'], axis=1 )
这个方法逻辑很直观:对每一行检查属性值是否为0,如果是,就从group_modes里取出对应类别的众数替换它。
方案二:一步到位(无需单独存储众数)
如果不想单独保存众数结果,可以直接用groupby.transform生成每行对应的类别众数,再结合replace完成替换,代码更简洁:
# 替换quality列的0值为对应类别众数 data['quality'] = data['quality'].replace( 0, data.groupby('class')['quality'].transform(lambda x: x.value_counts().index[0]) ) # 替换taste列的0值为对应类别众数 data['taste'] = data['taste'].replace( 0, data.groupby('class')['taste'].transform(lambda x: x.value_counts().index[0]) )
transform会生成和原DataFrame长度一致的Series,每个位置的值是该行所属类别的属性众数,replace只会把原列中的0值替换成这个对应位置的众数,其他值保持不变。
小提示
如果某个类别下的属性值全是0,那众数还是0,这种情况替换后不会有变化——不过你提到0是错误值,应该每个类别下都有非0的有效数据,所以不用担心这个问题~
内容的提问来源于stack exchange,提问作者Ahamed Moosa
相关产品推荐
相关产品推荐

