Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在Python中获取标签编码器的映射?_Python_Pandas_Categorical Data - Fatal编程技术网

有没有办法在Python中获取标签编码器的映射?

有没有办法在Python中获取标签编码器的映射?,python,pandas,categorical-data,Python,Pandas,Categorical Data,我正在使用以下代码将字符串转换为数据集中的分类值 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 对工作日进行编码后,我的数据集如下所示

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

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

我有没有办法知道星期天被映射到3,星期三被映射到6等等?首先,做一个分类系列:

weekdays = pd.Series(['Sun', 'Sun', 'Wed', 'Mon', 'Mon']).astype('category')
然后,检查其“类别”:


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

大概是这样的:

index    weekday
    0       3
    1       3
    2       6
    3       1
    4       1
    5       4
    6       5
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]))

您可以使用映射创建其他字典:

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}

有很多方法可以做到这一点。您可以考虑<代码> Pd.FaseIs,<代码> SkPult.Primult.LabelDebug 等等。但是,在这个特定的情况下,您有两个最适合您的选项:

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

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 ...
})

一个简单而优雅的方法来做同样的事情

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

如果在dataframe中有数字和分类两种类型的数据 您可以使用:这里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)

注意:如果您不想将它们转换回来,这项技术是很好的。

非常简单,它们有一个内置的函数

train['cat'] = train['cat'].map(list(train['cat'].value_counts().to_frame().reset_index().reset_index().set_index('index').to_dict().values())[0])
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)

若您不知道数据中有哪些不同的值,创建硬编码值列表可能会泄漏。但是,LabelEncoder()会处理任何可能出现的问题。据我所知,在转换所需列以获取实际值之后,需要实例化-le.classes,如果在具有多个列的数据帧上使用le.classes,比如使用lambda函数,然后le.classes只恢复最后一个编码列的字典映射。这是为什么?如果您解释了您提供的代码如何回答问题,这将是一个更好的答案。对于跨多个列的标签编码,我如何处理这个问题?