有什么方法可以获取Python pandas中标签编码器的映射吗?

问题描述 投票:0回答:11

我使用以下代码将字符串转换为数据集中的分类值。

data['weekday'] = pd.Categorical.from_array(data.weekday).labels 

例如,

index    weekday
0        Sunday
1        Sunday
2        Wednesday
3        Monday
4        Monday
5        Thursday
6        Tuesday

对工作日进行编码后,我的数据集如下所示:

index    weekday
    0       3
    1       3
    2       6
    3       1
    4       1
    5       4
    6       5

我有什么方法可以知道周日已映射到 3、周三映射到 6 等等?

python pandas categorical-data
11个回答
114
投票

您可以通过映射创建额外的字典:

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(data['name'])
le_name_mapping = dict(zip(le.classes_, le.transform(le.classes_)))
print(le_name_mapping)
{'Tom': 0, 'Nick': 1, 'Kate': 2}

42
投票

最好的方法是使用 sklearn 库的标签编码器。

类似这样的:

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(["paris", "paris", "tokyo", "amsterdam"])
list(le.classes_)
le.transform(["tokyo", "tokyo", "paris"])
list(le.inverse_transform([2, 2, 1]))

7
投票

一种简单而优雅的方式来做同样的事情。

cat_list = ['Sun', 'Sun', 'Wed', 'Mon', 'Mon']
encoded_data, mapping_index = pd.Series(cat_list).factorize()

你已经完成了,请检查下面

print(encoded_data)
print(mapping_index)
print(mapping_index.get_loc("Mon"))

5
投票

有很多方法可以做到这一点。您可以考虑

pd.factorize
sklearn.preprocessing.LabelEncoder
等。但是,在这种特定情况下,您有两个最适合您的选择:

按照您自己的方法,您可以添加类别:

pd.Categorical( df.weekday, [ 
    'Sunday', 'Monday', 'Tuesday', 
    'Wednesday', 'Thursday', 'Friday', 
    'Saturday']  ).labels

另一个选项是直接使用

dict

映射值
df.weekday.map({
    'Sunday': 0,
    'Monday': 1,
     # ... and so on. You get the idea ...
})

3
投票

首先,制作一个分类系列:

weekdays = pd.Series(['Sun', 'Sun', 'Wed', 'Mon', 'Mon']).astype('category')

然后,检查其“类别”:

weekdays.cat.categories.get_loc('Sun')

3
投票

如果数据框中有数值和分类两种类型的数据 您可以使用:这里 X 是我的数据框,具有分类变量和数值变量

from sklearn import preprocessing
le = preprocessing.LabelEncoder()

for i in range(0,X.shape[1]):
    if X.dtypes[i]=='object':
        X[X.columns[i]] = le.fit_transform(X[X.columns[i]])

或者你可以试试这个:

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder()
data = data.apply(le.fit_transform)

注意:如果您对将它们转换回来不感兴趣,则此技术很好。


3
投票

非常简单,他们有一个内置的功能。

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
..
# your model steps and when you have results
..

prediction_decoded = le.inverse_transform(prediction_encoded)
print(prediction_decoded)

3
投票

即使有很多答案可以回答这个OP'ed问题,我仍然添加我的答案,具体如下:

如果您已经将您的值标记为:

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit('column-or-list-of-values')

您可以获取值到整数代码的映射,如下所示:

dict(zip(le.classes_,range(len(le.classes_))))

0
投票
train['cat'] = train['cat'].map(list(train['cat'].value_counts().to_frame().reset_index().reset_index().set_index('index').to_dict().values())[0])

0
投票

从分类转换为数字后,您可以使用索引值创建另一列。将其视为主键列。

#新列,索引包含列工作日的转换值 data['index'] = pd.Categorical.from_array(data.weekday).labels

#查看对应的值 df.groupby(['索引','工作日']).first()


0
投票

您可以使用映射值更新“工作日”列,然后 DataFrame 将在“工作日”列中包含编码值。

data['weekday'] = data['weekday'].map({
    'Sunday': 0,
    'Monday': 1,
    'Tuesday': 2,
    'Wednesday': 3,
    'Thursday': 4,
    'Friday': 5,
    'Saturday': 6,
})
© www.soinside.com 2019 - 2024. All rights reserved.