使用特定列在 scikit-learn 中估算分类缺失值
Posted
技术标签:
【中文标题】使用特定列在 scikit-learn 中估算分类缺失值【英文标题】:Impute categorical missing values in scikit-learn using specific column 【发布时间】:2020-03-27 19:54:39 【问题描述】:我有患者数据集,我想处理这些数据的缺失值,它包含数字和文本,我想根据主题 ID 处理的想法。不仅基于列替换 数据集是这样的
subject_id time heart_rate blood_pressure urine_color
1 1.10 23 60 red
1 2 40
2 3 60 80
2 4 dark yellow
我想用最常见的病人数据替换文本数据,用病人的平均值替换数字,就像这样
subject_id time heart_rate blood_pressure urine_color
1 1.10 23 60 red
1 2 23 40 red
2 3 60 80 dark yellow
2 4 60 80 dark yellow
任何人都可以在这方面提供帮助,我搜索的所有估算方法,列中最常用的方法,或整个列的统计分析
【问题讨论】:
如果特定 subject_id 的 heart_rate 没有值怎么办? 它不会进行估算,否则我将在此步骤之后进行另一个基于整列估算的步骤。但这个想法将是少量的价值 【参考方案1】:将GroupBy.transform
与自定义函数一起用于mean
与数字列和mode
用于分类列并用DataFrame.fillna
替换缺失值:
f = lambda x: x.mean() if np.issubdtype(x.dtype, np.number) else x.mode().iat[0]
如果可能,每个组的分类列的所有 NaN
s 值的替代方案:
f = lambda x: x.mean() if np.issubdtype(x.dtype, np.number) else next(iter(x.mode()), None)
cols = df.columns.difference(['subject_id'])
df[cols] = df[cols].fillna(df.groupby('subject_id')[cols].transform(f))
print (df)
subject_id time heart_rate blood_pressure urine_color
0 1 1.1 23 60 red
1 1 2 23 40 red
2 2 3 60 80 dark yellow
3 2 4 60 80 dark yellow
【讨论】:
非常感谢您的关心,但如果您不介意解释答案的前两行 @Nora - 只需添加一些信息来回答,如果有必要解释更多让我知道 真的谢谢你,但是当它进行转换步骤时,它给了我以下错误(IndexError:('index 0 is out of bounds for axis 0 with size 0') @Nora - 你试试f = lambda x: x.mean() if np.issubdtype(x.dtype, np.number) else next(iter(x.mode()), None)
吗?似乎每组只有一些 NaN
是的,每组有一些 NaN 值。你是说试试另一个?以上是关于使用特定列在 scikit-learn 中估算分类缺失值的主要内容,如果未能解决你的问题,请参考以下文章
火炉炼AI机器学习019-项目案例:使用SVM回归器估算交通流量
scikit-learn 估算另一个特征中标称值组内特征的平均值
使用 Scikit-learn (sklearn) 估算整个 DataFrame(所有列)而不迭代列
如何在 Scikit-Learn 中获取 GridSearchCV() 的 OneVsRestClassifier(LinearSVC()) 的估算器键参考?