【问题标题】:Impute categorical missing values in scikit-learn using specific column使用特定列在 scikit-learn 中估算分类缺失值
【发布时间】: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 没有值怎么办?
  • 它不会进行估算,否则我将在此步骤之后进行另一个基于整列估算的步骤。但这个想法将是少量的价值

标签: python python-3.x pandas scikit-learn


【解决方案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 值。你是说试试另一个?
猜你喜欢
  • 2014-10-04
  • 2018-09-23
  • 2018-02-15
  • 2020-04-18
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 2019-08-10
  • 2016-02-27
相关资源
最近更新 更多