尝试将分类特征转换为数值时出现“ValueError:给定列不是数据框的列”

Posted

技术标签:

【中文标题】尝试将分类特征转换为数值时出现“ValueError:给定列不是数据框的列”【英文标题】:"ValueError: A given column is not a column of the dataframe" when trying to convert categorical feature into numerical 【发布时间】:2021-08-08 19:47:09 【问题描述】:

为了培训,我正在使用 Udemy 课程中的 csv 文件。我只想使用年龄和国家列来保持简单。 代码如下:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.compose import ColumnTransformer as ct
from sklearn.model_selection import train_test_split as tts

data = pd.read_csv("advertising.csv")

X = data[["Age","Country"]]
y = data[["Clicked on Ad"]]


from sklearn.preprocessing import OneHotEncoder
cat = X["Country"]
one_hot = OneHotEncoder()
transformer = ct([("one_hot", one_hot, cat)],remainder="passthrough")
transformed_X = transformer.fit_transform(X)

print(transformed_X)

我收到此错误:

runfile('C:/Users/--/.spyder-py3/untitled0.py', wdir='C:/Users/--/.spyder-py3')
Traceback (most recent call last):

  File "C:\Anaconda\lib\site-packages\pandas\core\indexes\base.py", line 2895, in get_loc
    return self._engine.get_loc(casted_key)

  File "pandas\_libs\index.pyx", line 70, in pandas._libs.index.IndexEngine.get_loc

  File "pandas\_libs\index.pyx", line 101, in pandas._libs.index.IndexEngine.get_loc

  File "pandas\_libs\hashtable_class_helper.pxi", line 1675, in pandas._libs.hashtable.PyObjectHashTable.get_item

  File "pandas\_libs\hashtable_class_helper.pxi", line 1683, in pandas._libs.hashtable.PyObjectHashTable.get_item

KeyError: 'Tunisia'


The above exception was the direct cause of the following exception:

Traceback (most recent call last):

  File "C:\Anaconda\lib\site-packages\sklearn\utils\__init__.py", line 447, in _get_column_indices
    col_idx = all_columns.get_loc(col)

  File "C:\Anaconda\lib\site-packages\pandas\core\indexes\base.py", line 2897, in get_loc
    raise KeyError(key) from err

KeyError: 'Tunisia'


The above exception was the direct cause of the following exception:

Traceback (most recent call last):

  File "C:\Users\--\.spyder-py3\untitled0.py", line 17, in <module>
    transformed_X = transformer.fit_transform(X)

  File "C:\Anaconda\lib\site-packages\sklearn\compose\_column_transformer.py", line 529, in fit_transform
    self._validate_remainder(X)

  File "C:\Anaconda\lib\site-packages\sklearn\compose\_column_transformer.py", line 327, in _validate_remainder
    cols.extend(_get_column_indices(X, columns))

  File "C:\Anaconda\lib\site-packages\sklearn\utils\__init__.py", line 454, in _get_column_indices
    raise ValueError(

ValueError: A given column is not a column of the dataframe

“突尼斯”是“国家”一栏下的第一个国家

什么可能导致了问题?

提前谢谢你。

【问题讨论】:

【参考方案1】:

出现问题是因为您没有指定要正确转换的列。在这一行:

transformer = ct([("one_hot", one_hot, cat)],remainder="passthrough")

cat 应该代表要转换的列的索引或名称。但是,由于您设置了cat = X["Country"],因此您正在传递整个数据框。

要解决此问题,只需使用以下方法之一:

#option 1
cat = ['Country']

# option 2
cat = [1]

它应该可以正常工作。

【讨论】:

改为传递索引。更新了答案。 谢谢!更改为 cat = [1] 后,它起作用了。顺便说一句,为什么 cat = "Country" 不起作用? 它没有用,因为你的数据框是一个二维数组。因此,您还必须以列表或类似数组的形式传递索引或名称。我在答案中包含了这两个选项。如果它是一维数组(即向量),cat='Country' 可以工作。

以上是关于尝试将分类特征转换为数值时出现“ValueError:给定列不是数据框的列”的主要内容,如果未能解决你的问题,请参考以下文章

一种热编码分类特征 - 仅稀疏形式

将分类网络流量特征转换为数值 - ISCX ***2016 数据集

数据预处理 | 使用 sklearn.preprocessing.OrdinalEncoder 将分类特征转换为数值型

为啥在尝试使用 python PIL 将 WMF 转换为 PNG 时出现渲染错误?

尝试将列表转换为 numpy 数组时出现 KeyError:0

尝试将字符串转换为 char[][] 时出现问题