有啥方法可以在 Python pandas 中获取标签编码器的映射?

Posted

技术标签:

【中文标题】有啥方法可以在 Python pandas 中获取标签编码器的映射?【英文标题】:Any way to get mappings of a label encoder in Python pandas?有什么方法可以在 Python pandas 中获取标签编码器的映射? 【发布时间】:2017-06-30 23:56:52 【问题描述】:

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

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 等等?

【问题讨论】:

【参考方案1】:

即使有很多答案可以专门回答这个 OP 问题,我仍在添加我的答案:

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

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

你可以得到值到整数代码的映射:

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

【讨论】:

【参考方案2】:

很简单,他们有一个内置函数。

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

【讨论】:

如果您解释了您提供的代码如何回答问题,这将是一个更好的答案。【参考方案4】:

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

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

【讨论】:

但问题正是在返回转换的路上...... :)【参考方案5】:

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

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

【讨论】:

如果您不知道数据中有哪些不同的值,创建硬编码值列表可能会泄漏。但是,LabelEncoder() 可以处理任何出现的问题。【参考方案6】:

有很多方法可以做到这一点。您可以考虑pd.factorizesklearn.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 ...
)

【讨论】:

【参考方案7】:

您可以使用映射创建额外的字典:

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

【讨论】:

如何处理跨多个列的标签编码?【参考方案8】:

最好的方法是使用 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]))

【讨论】:

据我了解- le.classes_ 需要在转换所需列以获取实际值后进行实例化,如果您使用 le.classes_ 说一个具有多个列编码的数据帧如果使用 lambda 函数,则 le.classes_ 仅恢复编码的最后一列的字典映射。这是为什么呢? 有什么办法可以持久化编码器吗?所以我们可以部署它?【参考方案9】:

首先,做一个分类系列:

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

然后,检查它的“类别”:

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

【讨论】:

以上是关于有啥方法可以在 Python pandas 中获取标签编码器的映射?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以在使用 python panda 时显示特定的单元格值以及标题和列值

python爬取到数据后通过pandas保存,但全都保存在一个单元格,有啥方法能分行分列保存?

用Python 做策略回测,耗时很长,有啥加速办法

有啥方法可以获取具有装饰器、Python、Django 的视图名称列表

有啥方法可以通过 Python 中的 id 获取对象的大小?

检测 pandas.DataFrame 中的列是不是是分类的有啥好的启发式方法?