使用特定列在 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]

如果可能,每个组的分类列的所有 NaNs 值的替代方案:

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()) 的估算器键参考?

Scikit-learn Imputer 降维

随着时间的推移更新 NaiveBayes 分类器(在 scikit-learn 中)