如何仅对数据集的特定列进行LabelEncode?

时间:2018-10-15 06:10:37

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

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

  

a = [[[安达曼和尼科巴群岛,尼古巴,2000年,哈里夫,阿雷卡努特,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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

# 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)