【问题标题】:Ordinal encoder issues with NaN valuesNaN 值的序数编码器问题
【发布时间】:2020-12-19 01:05:24
【问题描述】:

我有一个带有空格作为缺失值的数据框,因此我使用正则表达式将它们替换为 NaN 值。我遇到的问题是当我想使用序数编码来替换分类值时。到目前为止,我的代码如下:

    x=pd.DataFrame(np.array([30,"lawyer","France",
                             25,"clerk","Italy",
                             22," ","Germany",
                             40,"salesman","EEUU",
                             34,"lawyer"," ",
                             50,"salesman","France"]
                             
            ).reshape(6,3))
    x.columns=["age","job","country"]
    x = x.replace(r'^\s*$', np.nan, regex=True)

    oe=preprocessing.OrdinalEncoder()
    df.job=oe.fit_transform(df["job"].values.reshape(-1,1))

我收到以下错误:

Input contains NaN

我希望将作业列替换为以下数字:[1,2,-1,3,1,3]。

【问题讨论】:

  • 从 sklearn v1.0 开始,它将不再抱怨输入包含 NaN,因为来自scikit-learn.org/1.0/modules/…的“OrdinalEncoder 还将传递 np.nan 指示的缺失值”

标签: python pandas ordinal


【解决方案1】:

你可以试试factorize,注意这里是0开头的分类

x.job.mask(x.job==' ').factorize()[0]
Out[210]: array([ 0,  1, -1,  2,  0,  2], dtype=int32)

【讨论】:

  • 谢谢,非常好的答案,还有一个问题,如果我想使用 OrdinalEncoding() 我该怎么办?例如,用“空”之类的字符串替换 NaN?这是一个不错的选择吗?
  • @Little yes 保持为空,df.job=oe.fit_transform(df["jov"].values.reshape(-1,1))之后,将空行改为-1 ~
【解决方案2】:

sklearn.preprocessing.OrdinalEncoder 不允许NaN。如果你想使用它,你需要在提取到OrdinalEncoder之前删除NaN,将结果分配回列和fillna

from sklearn import preprocessing

oe = preprocessing.OrdinalEncoder()
x.loc[x.job.notna(), ['job']] = oe.fit_transform(x["job"].dropna().values.reshape(-1,1))
x['job'] = x.job.fillna(-1)

Out[52]:
  age  job  country
0  30  1.0   France
1  25  0.0    Italy
2  22 -1.0  Germany
3  40  2.0     EEUU
4  34  1.0      NaN
5  50  2.0   France

注意clerklawyer之前的序数排序,所以它的序数编码值必须小于lawyer。所以clerk0lawyer1

【讨论】:

    【解决方案3】:

    如果您想使用 None 值作为类别的第 0 个索引,这是一个解决方案

    注意:这里我有相同的类别项目列表,所以我为每一列使用了相同的列表,您可能有不同的列表

    all_categories = data[["columns", "you", "want"]].values.ravel()
    all_categories = [i for i in all_categories if pd.notnull(i)]
    unique_categories = [None] + list(pd.unique(all_categories))
    
    oe_cat = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1, categories=[unique_categories for _ in ["columns", "you", "want"]])
    oe_cat.fit(merged[["columns", "you", "want"]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 2019-04-28
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      相关资源
      最近更新 更多