【问题标题】:Attribute error when handling missing categorical data处理缺失的分类数据时出现属性错误
【发布时间】:2021-07-14 12:04:58
【问题描述】:

我正在尝试使用来自 sklearn_pandasCategoricalImputer 填充 NaN 分类值。

from sklearn_pandas import CategoricalImputer
imputer = CategoricalImputer()

nan_columns = train_df.loc[:, train_df.isnull().any()]

for column in nan_columns:
  imputer.fit_transform(column)

但是imputer.fit_transform(column) 给了我这个错误:

AttributeError: 'str' object has no attribute 'copy'

我正在按照文档执行此操作。我哪里错了?

编辑

我添加了这个单元格:

from sklearn.impute import SimpleImputer

nan_columns = train_df.loc[:, train_df.isnull().any()]
imputer = SimpleImputer(strategy="most_frequent")

imputer.fit_transform(train_df)
msno.bar(train_df.sample(1000), labels=True, fontsize=8)

但是,它没有用。这是显示列中仍然存在缺失值的条形图:

【问题讨论】:

  • 根据 README CategoricalImputer 已从 2.0.0 版本中删除,因为您可以使用 scikit-learn 中的 SimpleImputer
  • @AaronKeesing 您如何将 SimpleImputer 用于分类值?文档仅显示数值。

标签: python machine-learning data-science nan sklearn-pandas


【解决方案1】:

您可以通过使用 `strategy="most_frequent" 将 scikit-learn 中的 SimpleImputer 与分类值一起使用。

imp = SimpleImputer(strategy="most_frequent")
df = pd.DataFrame({"x": ["a", "a", np.nan],
                   "y": ["c", np.nan, "c"],
                   "z": ["a", np.nan, np.nan]})
print(df)
df[:] = imp.fit_transform(df)
print(df)

产量

     x    y    z
0    a    c    a
1    a  NaN  NaN
2  NaN    c  NaN

   x  y  z
0  a  c  a
1  a  c  a
2  a  c  a

如果您只想在字符串或分类列上使用它:

for col, tp in df.dtypes.items():
    if tp == object or tp.name == "category":
        df[col] = imp.fit_transform(df[[col]])

【讨论】:

  • 它没有用。该代码没有夸大 NaN 值。检查编辑。
  • 你实际上并没有分配回train_dffit_transform() 返回一个副本。
  • 如何绘制返回的副本?
  • 它返回一个数组,因此您需要从中创建一个新的数据框。然后你可以像往常一样绘制。或者你可以复制你的原始数据框,然后复制到df_copy[:] = imp.fit_transform(df_copy)
  • 是的,但是估算器的回报只分配给那些特定的列train_df[col] = imputer.fit_transform(train_df[[col]])
猜你喜欢
  • 2014-11-12
  • 2012-11-07
  • 2016-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-29
  • 2020-09-04
相关资源
最近更新 更多