标签编码具有相同类别的多个列


问题内容

考虑以下数据框:

import pandas as pd
from sklearn.preprocessing import LabelEncoder

df = pd.DataFrame(data=[["France", "Italy", "Belgium"], ["Italy", "France", "Belgium"]], columns=["a", "b", "c"])
df = df.apply(LabelEncoder().fit_transform)
print(df)

当前输出:

   a  b  c
0  0  1  0
1  1  0  0

我的目标是通过传入要共享分类值的列,使其输出类似以下内容的内容:

   a  b  c
0  0  1  2
1  1  0  2

问题答案:

传递,每行axis=1调用LabelEncoder().fit_transform一次。(默认情况下,每列df.apply(func)调用func一次)。

import pandas as pd
from sklearn.preprocessing import LabelEncoder

df = pd.DataFrame(data=[["France", "Italy", "Belgium"], 
                        ["Italy", "France", "Belgium"]], columns=["a", "b", "c"])

encoder = LabelEncoder()

df = df.apply(encoder.fit_transform, axis=1)
print(df)

产量

   a  b  c
0  1  2  0
1  2  1  0

另外,您可以使用make categorydtype的数据并将类别代码用作标签:

import pandas as pd

df = pd.DataFrame(data=[["France", "Italy", "Belgium"], 
                        ["Italy", "France", "Belgium"]], columns=["a", "b", "c"])

stacked = df.stack().astype('category')
result = stacked.cat.codes.unstack()
print(result)

也产生

   a  b  c
0  1  2  0
1  2  1  0

这应该明显更快,因为它不需要encoder.fit_transform为每一行调用一次(如果您有很多行,这可能会带来糟糕的性能)。