【问题标题】:How to LabelEncode only particular columns of the dataset?如何仅对数据集的特定列进行标签编码?
【发布时间】:2019-03-19 12:31:27
【问题描述】:

假设我现在有一个这样的数据集,我只想对具有字符串值的特定列进行编码。就像在下面提到的数组中,我只想对 a[0][0]、a[0][1]、a[0][3]、a[0][4] 进行 LabelEncode。

a = [[安达曼和尼科巴群岛, NICOBARS, 2000, Kharif, Arecanut, 1254.0, 2000.0]]

我试过的是:

dataset = pd.read_csv('crop_production.csv')

from sklearn import preprocessing

le = preprocessing.LabelEncoder()
dataset = dataset.apply(le.fit_transform)

但它甚至可以对数值进行编码。

知道如何只编码 csv 的特定列吗?

数据集示例:

State_Name  District_Name   Crop_Year   Season  Crop    Area    Production

Andaman and Nicobar Islands NICOBARS    2000    Kharif      Arecanut    1254.0  2000.0

【问题讨论】:

  • 您只想对数据帧的第 0、第 1、第 3 和第 4 列进行编码。我说的对吗?
  • 是的@SreeramTP 并再次解码
  • 好的。显示带有标题的数据框示例
  • a[0][4] 与 a[0][5] 有何不同。 4是字符串,5不是吗?
  • 您要编码的所有列。?请指定名称

标签: python python-3.x scikit-learn


【解决方案1】:

考虑如下所示的示例数据框

sample = pd.DataFrame()

sample['A'] = ['a', 'b', 'c', 'a']
sample['B'] = ['x', 'y', 'x', 'z']
sample['C'] = [1, 2, 3, 4]
sample['D'] = ['m', 'n', 'm', 'o']


# sample dataframe

    A   B   C   D
0   a   x   1   m
1   b   y   2   n
2   c   x   3   m
3   a   z   4   o

这里的 A、B 和 D 列包含字符串,C 列是数字。因此,您想对 A、B 和 D 进行编码,而不是对 C 进行编码。为此,您可以制作一个特定于一列的编码器,并根据需要对该列进行编码。请参阅下面的代码。

from sklearn.preprocessing import LabelEncoder

encoder_A = LabelEncoder()
encoder_B = LabelEncoder()
encoder_D = LabelEncoder()

sample['A'] = encoder_A.fit_transform(sample['A'])
sample['B'] = encoder_B.fit_transform(sample['B'])
sample['D'] = encoder_D.fit_transform(sample['D'])

# encoded dataframe

    A   B   C   D
0   0   0   1   0
1   1   1   2   1
2   2   0   3   0
3   0   2   4   2

您可以轻松将此代码扩展到您的特定问题。

【讨论】:

  • 直接意义上的。?不提供列名。?
  • 通过提供列名但不创建数据框
  • 你可以使用类似的逻辑。您可以提供列的索引,而不是提供列名。因为您已经在使用 pandas 来读取 csv,所以我认为没有必要
【解决方案2】:

您可以在不提供(或知道)列名的情况下使用的更通用的方法是:

# seperate categoricals from numericals
df_numeric = dataset.select_dtypes(exclude=['object'])
df_obj = dataset.select_dtypes(include=['object']).copy()

# now factorize categoricals
for c in df_obj:
    df_obj[c] = pd.factorize(df_obj[c])[0]

# merge back into one dataframe
df_final = pd.concat([df_numeric, df_obj], axis=1)
df_final.reset_index(inplace=True, drop=True)

【讨论】:

  • 但话又说回来,如果我想解码它应该怎么做,我将 a 编码为 1 现在我想要 1 的相应值,如何实现?
猜你喜欢
  • 2021-11-17
  • 2014-09-30
  • 1970-01-01
  • 2020-10-30
  • 2020-11-25
  • 2022-01-11
  • 2018-06-29
  • 1970-01-01
  • 2015-12-13
相关资源
最近更新 更多