【问题标题】:Replacing rows having 0 to mean/ of the column将具有 0 的行替换为列的均值/
【发布时间】:2020-04-12 22:34:53
【问题描述】:

我正在尝试在数据集中估算 5 列,但每列中没有任何空白,我需要将具有 0 的行估算为均值/中位数,我独立尝试了以下 2 种替代方法,如下所示

from sklearn.impute import SimpleImputer
impute = SimpleImputer(missing_values=0,strategy='mean')

impute.fit_transform(train[['Glucose','BloodPressure','SkinThickness','Insulin','BMI']])

train["Glucose"].fillna(train["Glucose"].mean(), inplace=True)

为了交叉检查,我尝试在每列 train['Glucose'].unique() 中找到唯一值,在每个替代项之后查找插补后是否有任何 0。 输出确实显示为 0 如下,表明上述两种方法均无效。

输出

array([148,  85, 183,  89, 137, 116,  78, 115, 197, 125, 110, 168, 139,
       189, 166, 100, 118, 107, 103, 126,  99, 196, 119, 143, 147,  97,
       145, 117, 109, 158,  88,  92, 122, 138, 102,  90, 111, 180, 133,
       106, 171, 159, 146,  71, 105, 101, 176, 150,  73, 187,  84,  44,
       141, 114,  95, 129,  79,   **0**,  62, 131, 112, 113,  74,  83, 136,
        80, 123,  81, 134, 142, 144,  93, 163, 151,  96, 155,  76, 160,
       124, 162, 132, 120, 173, 170, 128, 108, 154,  57, 156, 153, 188,
       152, 104,  87,  75, 179, 130, 194, 181, 135, 184, 140, 177, 164,
        91, 165,  86, 193, 191, 161, 167,  77, 182, 157, 178,  61,  98,
       127,  82,  72, 172,  94, 175, 195,  68, 186, 198, 121,  67, 174,
       199,  56, 169, 149,  65, 190], dtype=int64)

如果有人能指导我在哪里我的代码有错误或任何其他估算方式,我将不胜感激。

【问题讨论】:

  • 标记为已回答的问题并没有具体回答我的问题,我不想用 0 替换空格,我想用 0 替换来表示。请求@jezrael 重新打开帖子。我花了过去 30 分钟检查,但没有发现任何有用的信息来帮助我的查询。
  • 所以两个解决方案都失败了?
  • 是的,我再次检查了建议的问题,他们都尝试将 nan 替换为 0,我认为我的查询略有不同。我可能会犯一些概念错误。

标签: python scikit-learn


【解决方案1】:

如果想将 0 替换为 means 您的第一个解决方案对我来说很好,第二个解决方案是必要的更改,将 0 替换为 NaNs 然后可以使用 fillna

np.random.seed(42)
columns = ['Glucose','BloodPressure','SkinThickness','Insulin','BMI']
train = pd.DataFrame(np.random.randint(5, size=(10,5)), columns=columns)
print (train)
   Glucose  BloodPressure  SkinThickness  Insulin  BMI
0        3              4              2        4    4
1        1              2              2        2    4
2        3              2              4        1    3
3        1              3              4        0    3
4        1              4              3        0    0
5        2              2              1        3    3
6        2              3              3        0    2
7        4              2              4        0    1
8        3              0              3        1    1
9        0              1              4        1    3

from sklearn.impute import SimpleImputer
impute = SimpleImputer(missing_values=0,strategy='mean')

c = ['Glucose','BloodPressure','SkinThickness','Insulin','BMI']
df1 = pd.DataFrame(impute.fit_transform(train[c]), columns=c)
print (df1)
    Glucose  BloodPressure  SkinThickness  Insulin       BMI
0  3.000000       4.000000            2.0      4.0  4.000000
1  1.000000       2.000000            2.0      2.0  4.000000
2  3.000000       2.000000            4.0      1.0  3.000000
3  1.000000       3.000000            4.0      2.0  3.000000
4  1.000000       4.000000            3.0      2.0  2.666667
5  2.000000       2.000000            1.0      3.0  3.000000
6  2.000000       3.000000            3.0      2.0  2.000000
7  4.000000       2.000000            4.0      2.0  1.000000
8  3.000000       2.555556            3.0      1.0  1.000000
9  2.222222       1.000000            4.0      1.0  3.000000

df2 = train.mask(train == 0)
df2 = df2.fillna(df2.mean())
print (df2)
    Glucose  BloodPressure  SkinThickness  Insulin       BMI
0  3.000000       4.000000              2      4.0  4.000000
1  1.000000       2.000000              2      2.0  4.000000
2  3.000000       2.000000              4      1.0  3.000000
3  1.000000       3.000000              4      2.0  3.000000
4  1.000000       4.000000              3      2.0  2.666667
5  2.000000       2.000000              1      3.0  3.000000
6  2.000000       3.000000              3      2.0  2.000000
7  4.000000       2.000000              4      2.0  1.000000
8  3.000000       2.555556              3      1.0  1.000000
9  2.222222       1.000000              4      1.0  3.000000

编辑:如果有更多列无法估算,则解决方案:

np.random.seed(42)
columns = ['col1','col2','Glucose','BloodPressure','SkinThickness','Insulin','BMI']
train = pd.DataFrame(np.random.randint(5, size=(10,7)), columns=columns)
print (train)
   col1  col2  Glucose  BloodPressure  SkinThickness  Insulin  BMI
0     3     4        2              4              4        1    2
1     2     2        4              3              2        4    1
2     3     1        3              4              0        3    1
3     4     3        0              0              2        2    1
4     3     3        2              3              3        0    2
5     4     2        4              0              1        3    0
6     3     1        1              0              1        4    1
7     3     3        3              3              4        2    0
8     3     1        3              1              1        3    4
9     1     1        3              1              1        3    3

from sklearn.impute import SimpleImputer
impute = SimpleImputer(missing_values=0,strategy='mean')

c = ['Glucose','BloodPressure','SkinThickness','Insulin','BMI']
train[c] = impute.fit_transform(train[c])
print (train)
   col1  col2   Glucose  BloodPressure  SkinThickness   Insulin    BMI
0     3     4  2.000000       4.000000       4.000000  1.000000  2.000
1     2     2  4.000000       3.000000       2.000000  4.000000  1.000
2     3     1  3.000000       4.000000       2.111111  3.000000  1.000
3     4     3  2.777778       2.714286       2.000000  2.000000  1.000
4     3     3  2.000000       3.000000       3.000000  2.777778  2.000
5     4     2  4.000000       2.714286       1.000000  3.000000  1.875
6     3     1  1.000000       2.714286       1.000000  4.000000  1.000
7     3     3  3.000000       3.000000       4.000000  2.000000  1.875
8     3     1  3.000000       1.000000       1.000000  3.000000  4.000
9     1     1  3.000000       1.000000       1.000000  3.000000  3.000

c = ['Glucose','BloodPressure','SkinThickness','Insulin','BMI']
df2 = train[c].mask(train[c] == 0)
train[c] = df2.fillna(df2.mean())
print (train)
   col1  col2   Glucose  BloodPressure  SkinThickness   Insulin    BMI
0     3     4  2.000000       4.000000       4.000000  1.000000  2.000
1     2     2  4.000000       3.000000       2.000000  4.000000  1.000
2     3     1  3.000000       4.000000       2.111111  3.000000  1.000
3     4     3  2.777778       2.714286       2.000000  2.000000  1.000
4     3     3  2.000000       3.000000       3.000000  2.777778  2.000
5     4     2  4.000000       2.714286       1.000000  3.000000  1.875
6     3     1  1.000000       2.714286       1.000000  4.000000  1.000
7     3     3  3.000000       3.000000       4.000000  2.000000  1.875
8     3     1  3.000000       1.000000       1.000000  3.000000  4.000
9     1     1  3.000000       1.000000       1.000000  3.000000  3.000

【讨论】:

  • 上述建议创建了一个单独的 DataFrame 权利,但是我更喜欢这样做而不创建新数据,因为除了我试图估算的列之外,我还有其他列来帮助我预测结果.数据中的总列如下 Index(['妊娠', '血糖', '血压', '皮肤厚度', '胰岛素', 'BMI', '糖尿病谱系功能', '年龄', '结果'] , dtype='object') & 我只是想推算• 葡萄糖• 血压• 皮肤厚度• 胰岛素• BMI 抱歉之前没有提到这一点。
  • 第二种选择为我提供了所需的解决方案,谢谢。!我将处理以前的代码。
  • @Sid - 针对新要求修改了解决方案。
猜你喜欢
  • 2012-06-17
  • 2013-03-12
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 1970-01-01
相关资源
最近更新 更多