小能豆

scikit-learn 中跨多列的标签编码

javascript

我正在尝试使用 scikit-learn 来LabelEncoder编码 pandasDataFrame字符串标签。由于数据框有很多 (50+) 列,我想避免LabelEncoder为每一列创建一个对象;我宁愿只创建一个LabelEncoder适用于我所有数据列的大对象。

将整个DataFrame放入LabelEncoder会产生以下错误。请记住,我在这里使用的是虚拟数据;实际上,我正在处理大约 50 列带字符串标签的数据,因此需要一个不按名称引用任何列的解决方案。

import pandas
from sklearn import preprocessing 

df = pandas.DataFrame({
    'pets': ['cat', 'dog', 'cat', 'monkey', 'dog', 'dog'], 
    'owner': ['Champ', 'Ron', 'Brick', 'Champ', 'Veronica', 'Ron'], 
    'location': ['San_Diego', 'New_York', 'New_York', 'San_Diego', 'San_Diego', 
                 'New_York']
})

le = preprocessing.LabelEncoder()

le.fit(df)

回溯(最近一次调用最后一次):文件“”,第 1 行,在文件“/Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/preprocessing/label.py”,第 103 行,在 fit y = column_or_1d(y,warn=True)文件“/Users/bbalin/anaconda/lib/python2.7/site-packages/sklearn/utils/validation.py”,第 306 行,在 column_or_1d 中引发 ValueError(“错误输入形状 {0}”。格式(shape))ValueError:错误输入形状(6,3)

关于如何解决这个问题您有什么想法吗?


阅读 56

收藏
2024-07-27

共1个答案

小能豆

LabelEncoder无法直接使用整个 DataFrame,因为LabelEncoder它需要的是 1D 标签数组,而不是 DataFrame。但是,您可以将它LabelEncoder单独应用于每一列,而不必按名称引用每一列。

以下是实现此目的的方法apply

import pandas as pd
from sklearn.preprocessing import LabelEncoder

# Sample DataFrame
df = pd.DataFrame({
    'pets': ['cat', 'dog', 'cat', 'monkey', 'dog', 'dog'], 
    'owner': ['Champ', 'Ron', 'Brick', 'Champ', 'Veronica', 'Ron'], 
    'location': ['San_Diego', 'New_York', 'New_York', 'San_Diego', 'San_Diego', 'New_York']
})

# Create a LabelEncoder instance
le = LabelEncoder()

# Apply LabelEncoder to each column in the DataFrame
encoded_df = df.apply(lambda col: le.fit_transform(col))

print(encoded_df)

解释:

  1. 创建 DataFrame:示例 DataFramedf包含三列:petsownerlocation
  2. 创建 LabelEncoder 实例le = LabelEncoder()创建一个 的单个实例LabelEncoder
  3. 将 LabelEncoder 应用于每一列df.apply(lambda col: le.fit_transform(col))将应用于LabelEncoderDataFrame 中的每一列。该apply函数对每一列进行迭代,并将le.fit_transform(col)编码器与列中的唯一值相匹配,并将列转换为编码标签。
  4. 结果encoded_df是一个具有与原始相同结构的数据帧,但所有字符串标签都转换为整数标签。

笔记:

  • 这种方法会创建一个LabelEncoder实例,但会单独重复用于每一列。如果您需要保留每一列的映射以用于逆变换或其他目的,则可能需要单独存储每一列的编码器。

这是存储每列编码器的扩展版本:

# Dictionary to store encoders for each column
encoders = {}

# Apply LabelEncoder to each column and store the encoders
encoded_df = df.apply(lambda col: encoders.setdefault(col.name, LabelEncoder()).fit_transform(col))

print(encoded_df)
print(encoders)

在此版本中,encoders是一个字典,其中每个键都是一个列名,每个值都是相应的LabelEncoder实例。这允许您根据需要访问特定列的编码器。

2024-07-27