Python 用 0-x 索引替换列值(对于 xgboost)
Python replacing column values with 0-x indexes (for xgboost)
我正在使用 python(与 pandas 等)
我有一个带有标签列的数据框(类 a、b、c 等 - 总共 38 个)。
我想使用 Xgboost 进行预测,但它只适用于 0:num_classes 范围内的标签。
所以基本上我需要:
- 用 0:num_class 索引替换标签列中的所有值(a 为 0,b 为 1,c 为 2 等)
类的个数是38个,无法手动映射替换。
有没有一种优雅的方法可以做到这一点?
(在 R 中我会使用:
train_data$Class <- as.numeric(factor(train_data$Class))
但是这里不行
您可以使用 pandas.factorize 函数:
import pandas as pd
df.Class = pd.factorize(df.Class)[0]
如果你想要向后,你可以存储那个变量然后重新分配它:
factor = pd.factorize(df.Class)
# forward
df.Class = factor[0]
# backward
df.Class = factor[1]
对于简单的转换,您可以在数据框上使用 map 方法,
df.class
Out[34]:
1 a
2 b
3 c
4 c
5 b
6 a
Name: 0, dtype: object
df.class.map({'a':1,'b':2,'c':3})
Out[35]:
1 1
2 2
3 3
4 3
5 2
6 1
Name: 0, dtype: int64
labels = ['a','b','a','c','b','a','c','a']
y = pandas.Series(labels)
unique_labels, y_inversed = numpy.unique(y, return_inverse=True)
print list(unique_labels[y_inversed]) == labels
结果:
真
我正在使用 python(与 pandas 等) 我有一个带有标签列的数据框(类 a、b、c 等 - 总共 38 个)。 我想使用 Xgboost 进行预测,但它只适用于 0:num_classes 范围内的标签。
所以基本上我需要: - 用 0:num_class 索引替换标签列中的所有值(a 为 0,b 为 1,c 为 2 等)
类的个数是38个,无法手动映射替换。 有没有一种优雅的方法可以做到这一点? (在 R 中我会使用:
train_data$Class <- as.numeric(factor(train_data$Class))
但是这里不行
您可以使用 pandas.factorize 函数:
import pandas as pd
df.Class = pd.factorize(df.Class)[0]
如果你想要向后,你可以存储那个变量然后重新分配它:
factor = pd.factorize(df.Class)
# forward
df.Class = factor[0]
# backward
df.Class = factor[1]
对于简单的转换,您可以在数据框上使用 map 方法,
df.class
Out[34]:
1 a
2 b
3 c
4 c
5 b
6 a
Name: 0, dtype: object
df.class.map({'a':1,'b':2,'c':3})
Out[35]:
1 1
2 2
3 3
4 3
5 2
6 1
Name: 0, dtype: int64
labels = ['a','b','a','c','b','a','c','a']
y = pandas.Series(labels)
unique_labels, y_inversed = numpy.unique(y, return_inverse=True)
print list(unique_labels[y_inversed]) == labels
结果: 真